ML匿名函数交替求和

时间:2014-10-31 15:05:46

标签: function anonymous ml

对于我在ML中的作业分配,我必须使用fold函数和匿名函数将整数列表转换为交替的和。如果列表为空,则结果为0.这是我到目前为止所拥有的。我认为我所拥有的是正确的,但我最大的问题是我无法弄清楚如何编写我所拥有的匿名函数。任何帮助将不胜感激。

    fun foldl f y nil = y
    | foldl f y (x::xr) = 
    foldl f(f(x,y))xr;

    val sum = foldl (op -) ~6[1,2,3,4,5,6];

    val sum = foldl (op -) ~4[1,2,3,4];

    val sum = foldl (op -) ~2[1,2];

这些只是我测试的一些例子,看看我的工作是否正常,我认为这三个都是正确的。

1 个答案:

答案 0 :(得分:1)

有两种情况:一种是列表长度为偶数,一种是列表长度为奇数。如果我们有一个列表[a,b,c,d,e],则交替的总和为a - b + c - d + e。您可以将其重写为

e - (d - (c - (b - a)))

如果列表具有偶数长度,例如[a,b,c,d],那么我们可以将其交替的和写为

- (d - (c - (b - a)))

因此,为了解决这两种情况,我们可以将我们的累加器用于折叠为3元组,其中如果列表是奇数,则第一个条目是正确的值,如果列表是偶数,则第二个条目是正确的值,第三个值告诉我们我们看过的元素数量,如果答案是第一个或第二个条目,我们可以在最后知道这些元素。

所以像

这样的匿名函数
fn (x,y,n) => (x - #1 y, ~(x + #2 y), n + 1)

可以使用,我们可以将它与foldl一起使用,启动累加器为(0,0,0),所以

fun alternating_sum xs =
  let
    (v1, v2, n) = foldl (fn (x,y,n) => (x - #1 y, ~(x + #2 y), n + 1)) (0,0,0) xs
  in
    if n mod 2 = 0 then v2 else v1
  end