“foldl1(\ a b - >(snd a + snd b))[(1,2),(3,4)]的Haskell错误

时间:2010-12-07 17:07:01

标签: haskell

为什么这不起作用?

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)))'

2 个答案:

答案 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)