为什么我必须为Fractional:编写这样的类型约束
isItTwo' :: (Eq a, Fractional a) => a -> Bool
isItTwo' 2 = True
isItTwo' _ = False
但对于Integral:
isItTwo :: Integral a => a -> Bool
isItTwo 2 = True
isItTwo _ = False
积分作为一个类型类不应该也在等式中吗?
像Integral
和Fractional
这样的Haskell数字类型类有时有点奇怪。
在这种情况下,恰好Integral
类型的类是Real
的子类,CCD_4是Ord
的子类。因此,Integral a
约束包含Real a, Ord a, Eq a
,不需要添加这些约束。
相比之下,Fractional
是Num
的一个子类,而不是Eq
的子类,因此必须手动添加Eq
。
其原理不太容易猜测,但我想说Fractional
和Num
类型类允许不相等的类型。也许有人想用Integer -> Bool
这样的东西来表示某个实数的二进制数字,但这不容易比较(或打印(。毕竟,Fractional
只需要fromRational
,所以我们不能将分数类型转换为有理类型并进行比较
相反,Integral
包含Real
,后者需要toRational
,因此这些类型必须是可比较的。添加Eq
作为超类是有意义的,因为无论如何都必须可以进行比较。