2017-02-24 178 views
1

下面是使用梯形方法计算定积分的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养活这个功能。下面是我的尝试,收到错误截图: enter image description here

在这张图片中,我定义立方体X = X X X,并显示它的工作原理,然后尝试将其提供给了整合功能无济于事。

回答

4

的错误信息是非常具体:integrate期待real -> real类型的功能,但你定义的函数,cubeint -> 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