2014-10-31 24 views
0

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

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

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

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

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

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

因此,为了解决这两种情况,我们可以让我们的fold的累加器是一个三元组,如果列表是奇数,那么第一个条目是正确的值,如果列表是偶数,第二个条目是正确的值,第三个值告诉我们我们看过的元素的数量,最后我们可以用它来知道答案是第一个还是第二个条目。

所以像

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