使用FOLDR(SML)的交替总和

时间:2014-11-04 20:05:55

标签: list sml fold

我正在尝试使用foldrint列表中获取交替的和,但不断收到运算符/操作数不匹配错误。我有一种感觉,我不完全理解foldr

l = [1,3,5,7,9]
foldr (op-) l

我希望输出为

1 - 3 + 5 - 7 + 9 = 5

编辑:

我实际上被要求使用foldr

的匿名函数

所以,例如

l = [1,3,5,7,9]
foldr (fn (x, y): => x - y) l

具有相同的预期输出,但我仍然得到相同的操作数/运算符不匹配

2 个答案:

答案 0 :(得分:3)

foldr(以及foldl)取一个初始值。

foldr的类型为('a * 'b -> 'b) -> 'b -> 'a list -> 'b,其中'b是折叠中每个步骤的结果类型(以及初始值,即初始“结果”) ); 'a是列表中元素的类型。请注意,'a'b可能不同。 combine函数接受一个元素和一个先前的结果,并返回新的结果。

无论如何,您需要考虑适当的初始值。它应该是什么?我想0会这样做:

foldr op- 0 l

答案 1 :(得分:1)

仅使用List.foldl功能的解决方案如下。

fun altSum ls = if (List.foldl op+ 0 (map (fn x => 1) ls)) mod 2 = 0 
                then ~1 * (List.foldl (fn (x, y) => y - x) 0 ls)
                else List.foldl (fn (x, y) => y - x) 0 ls

你可以看到为什么这有效here