将函数传递给函数SML
问题描述:
下面是使用梯形方法计算定积分的SML代码,给定输入f =一元函数a & b =在积分下的范围,以及n =除以子区间的数量进入的范围。将函数传递给函数SML
fun integrate f a b n =
let val w = (b - a)/(real n)
fun genBlock c = let val BB = f c
val SB = f (c+w)
in (BB + SB) * w/2.0
end
fun sumSlice 0 c acc = acc
| sumSlice n c acc = sumSlice (n-1) (c+w) (acc + (genBlock c))
in sumSlice n a 0.0
end
问题是我无法弄清楚了我的生活如何定义一个函数(比如X立方),并将其与A,B,和n养活这个功能。下面是我的尝试,收到错误截图:
在这张图片中,我定义立方体X = X X X,并显示它的工作原理,然后尝试将其提供给了整合功能无济于事。
答
的错误信息是非常具体:integrate
期待real -> real
类型的功能,但你定义的函数,cube
,int -> int
类型。
有几件事情可以做:
1)添加类型注释的cube
定义:
- fun cube x:real = x*x*x;
val cube = fn : real -> real
然后:
- integrate cube 0.0 5.0 5;
val it = 162.5 : real
2)你可以免去定义cube
作为命名函数,只需将计算作为匿名函数传递即可。在这种情况下,SML的类型推理机制给出了函数x => x*x*x
的预期类型:
- integrate (fn x => x*x*x) 0.0 5.0 5;
val it = 162.5 : real