我要编写一个匿名函数,它取一个整数和两个函数f和g的列表。函数在列表中的even int上应用f,并在odd int上应用g。最后,函数返回所有计算值的总和.. f(x)=2x,g(x)=x*x
我的代码是
val f = fn x => 2 * x;
val g = fn x => x * x;
fun s [] f g = []
| s L f g =
let
val n = hd(L) mod 2;
in
fn n => case n of
0 => f(hd(L)) + s tl(L) f g
| x => g(hd(L)) + s tl(L) f g
end;
有什么不对?
答案 0 :(得分:2)
首先,您应该在tl(L)
周围加上括号,以便正确解析s (tl(L)) f g
的调用。其次,函数的返回类型为int
,因此基本案例[]
应返回0
,归纳案例不应为fn n =>
(因为n
已经由val
)定义。
我使用模式匹配而不是hd
,tl
重构了函数,并将频繁更改的参数作为最后一个:
fun sum f g [] = 0
| sum f g (x::xs) =
let
val n = x mod 2
in
case n of
0 => f x + sum f g xs
| _ => g x + sum f g xs
end;