foldl表达式由于使用文字而无法编译

时间:2016-10-31 11:41:52

标签: haskell

我有以下使用foldl的错误:

elementAt :: [a] -> Int -> a
elementAt [] x = error "No empty lists for element-at"
elementAt xs x = foldl(\acc (a, b) -> if(b == x) then a else acc) 0 $ zip xs [0..]

当我尝试编译时,我收到此错误:

  

exercises.hs:8:67:错误:       *没有来自文字0' Possible fix: add (Num a) to the context of the type signature for: elementAt :: [a] -> Int -> a * In the second argument of foldl'的(Num a)实例,即“0”         在表达式中:           foldl(\ acc(a,b) - > if(b == x)then a else acc)0         在表达式中:           foldl(\ acc(a,b) - > if(b == x)then a else acc)0           $ zip xs [0 ..]失败,模块加载:无。

1 个答案:

答案 0 :(得分:5)

如果找不到该元素,则函数的结果为0。只有在使用数字列表时才有意义。如果您传入一个字符串列表,然后从列表中返回一个字符串或数字0,那将是一个明确的类型错误。

因此,您的函数仅适用于数字列表,您的类型签名必须通过添加Num a约束来反映这一点。

然而,更好的解决方案是不使用0作为默认值,而是使用Maybe。这样您就不必将自己局限于数字列表。