我有以下使用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..]
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,我收到此错误:
exercise.hs:8:67:错误:*没有实例(Num a)来自文字
0' Possible fix: add (Num a) to the context of the type signature for: elementAt :: [a] -> Int -> a * In the second argument offoldl',即'0'在表达式中:foldl(\ acc(a,b) - > if(b == x )然后a else acc)0在表达式中:foldl(\ acc(a,b) - > if(b == x)然后a else acc)0 $ zip xs [0 ..]失败,模块加载:无.
如果找不到元素,则函数的结果为0.只有在使用数字列表时才有意义.如果传入一个字符串列表,然后从列表中返回一个字符串或数字0,那将是一个明确的类型错误.
因此,您的函数仅适用于数字列表,您的类型签名必须通过添加Num a约束来反映.
但是,更好的解决方案是不使用0默认值并使用Maybe替代.这样您就不必将自己限制在数字列表中.