将函数传递给函数 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
下面是使用梯形法计算定积分的 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