此函数不正确,无法编译:
checkIsZero :: (Num a) => a -> String
checkIsZero a = if a == 0
then "Zero"
else "Not zero"
Run Code Online (Sandbox Code Playgroud)
由于a Num和0表达式之间的比较,这不起作用a == 0.更改Num为Integral使其成为有效的函数.
什么是这个邪恶的巫术,不让我比较我的数字0?!
jto*_*bin 24
Num需要实例来实现+,*,abs,signum,和fromInteger.请注意,==不在列表中!它Eq是必须实现的类型类的实例==.
所以,Num约束是不够的 - 你也需要一个Eq约束.以下将编译.
checkIsZero :: (Eq a, Num a) => a -> String
checkIsZero a | a == 0 = "Zero"
| otherwise = "Not zero"
Run Code Online (Sandbox Code Playgroud)
Integral因为作为Integral必须的实例的东西本身就是一个实例Ord,而它必须是一个实例Eq.
您可以使用hoogle检查所有这些内容并深入挖掘源代码.
Chr*_*lor 10
不要求Eq实例定义Num实例的原因是它会排除有用的实例,例如
instance Num b => Num (a -> b) where
f + g = \x -> f x + g x
f - g = \x -> f x - g x
f * x = \x -> f x * g x
abs f = \x -> abs (f x)
signum f = \x -> signum (f x)
fromInteger = const . fromInteger
Run Code Online (Sandbox Code Playgroud)
因为你不能Eq为函数编写实例.