我正在尝试使用foldr
从int
列表中获取交替的和,但不断收到运算符/操作数不匹配错误。我有一种感觉,我不完全理解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
具有相同的预期输出,但我仍然得到相同的操作数/运算符不匹配
答案 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。