Rav*_*ven 1 polymorphism haskell overloading
我有一个简单的函数定义如下:
allZero :: Num a => [a]-> Bool
allZero [] = False
allZero xs = and (map (== 0) xs)
Run Code Online (Sandbox Code Playgroud)
这会在加载时返回错误消息:
无法推断(Num a)由字面值"0"引起
这个功能有什么问题?如何将数字0过载为任何数字类型?
一旦您添加Eq a约束,此代码就会编译allZero.编译此代码时不应存在其他问题.
allZero :: (Num a, Eq a) => [a]-> Bool
allZero [] = False
allZero xs = and (map (== 0) xs)
Run Code Online (Sandbox Code Playgroud)
正如一些评论者指出,第一种情况是非标准的,如allZero的[]典型True.根据该定义,第一种情况变得多余.