将函数传递给函数 SML

passing a function to a function SML

下面是使用梯形法计算定积分的 SML 代码,给定输入 f=一元函数,a & b=要积分的范围,n=要划分范围的子区间数。

    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 将它提供给这个函数。这是我尝试并收到错误的屏幕截图:

在这张图片中,我定义了 cube x =xxx 并显示它有效,然后尝试将其提供给集成功能无济于事。

错误消息非常具体:integrate 需要一个 real -> real 类型的函数,但您定义了一个 int -> int 类型的函数 cube

您可以做几件事:

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