为什么这不起作用?
Prelude> foldl1 (\a b -> ((snd a) + (snd b))) [(1,2),(3,4)]
<interactive>:1:17:
Occurs check: cannot construct the infinite type: b = (a, b)
Expected type: (a, b)
Inferred type: b
In the expression: ((snd a) + (snd b))
In the first argument of `foldl1', namely
`(\ a b -> ((snd a) + (snd b)))'
答案 0 :(得分:12)
foldl1
的函数参数必须具有类型a -> a -> a
,即2个输入参数和返回值必须具有相同的类型。在您的表达式中,该函数应返回2元组Num b => (a, b)
,而不是纯数字Num b => b
,因此“发生检查”。
您可以使用foldl
并提供初始值,例如
foldl (\acc elm -> acc + snd elm) 0 [(1,2),(3,4)]
或使用现有功能
(sum . map snd) [(1,2),(3,4)]
答案 1 :(得分:2)
您提供给foldl1
的函数必须返回与数组中相同类型的值。
您的数组包含(Number, Number)
类型的元组,但您返回的类型为Number
。
如果你想在这种情况下返回一个数字,你必须使用foldl
而不是foldl1
并稍微写一下(就像KennyTM上面写的那样:D)