Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/function/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function ML匿名函数交替和_Function_Anonymous_Ml - Fatal编程技术网

Function ML匿名函数交替和

Function ML匿名函数交替和,function,anonymous,ml,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 su

对于我在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];

这些只是我测试的一些示例,看看我的工作是否正确,我认为这三种情况都是正确的。

有两种情况:一种是列表长度为偶数,另一种是列表长度为奇数。如果我们有一个列表
[a,b,c,d,e]
,那么交替和就是
a-b+c-d+e
。您可以将此重新编写为

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

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

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

为了解决这两种情况,我们可以让fold的累加器是一个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