Haskell - 重载数字类型

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过载为任何数字类型?

cro*_*eea 7

一旦您添加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.根据该定义,第一种情况变得多余.