匿名函数,以ml为单位

时间:2012-10-18 16:44:48

标签: sml

我要编写一个匿名函数,它取一个整数和两个函数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;

有什么不对?

1 个答案:

答案 0 :(得分:2)

首先,您应该在tl(L)周围加上括号,以便正确解析s (tl(L)) f g的调用。其次,函数的返回类型为int,因此基本案例[]应返回0,归纳案例不应为fn n =>(因为n已经由val)定义。

我使用模式匹配而不是hdtl重构了函数,并将频繁更改的参数作为最后一个:

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;