下面是使用梯形方法计算定积分的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 = x x x 并显示它有效,然后尝试将其提供给集成功能无效。
答案 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