我有以下使用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 ..]失败,模块加载:无。
答案 0 :(得分:5)
如果找不到该元素,则函数的结果为0
。只有在使用数字列表时才有意义。如果您传入一个字符串列表,然后从列表中返回一个字符串或数字0
,那将是一个明确的类型错误。
因此,您的函数仅适用于数字列表,您的类型签名必须通过添加Num a
约束来反映这一点。
然而,更好的解决方案是不使用0
作为默认值,而是使用Maybe
。这样您就不必将自己局限于数字列表。