将函数传递给函数SML

时间:2017-02-24 23:43:10

标签: functional-programming sml ml

下面是使用梯形方法计算定积分的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将它提供给这个函数。这是我尝试并收到错误的屏幕截图: enter image description here

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

1 个答案:

答案 0 :(得分:4)

错误消息非常具体: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