Haskell类型约束



为什么我必须为Fractional:编写这样的类型约束

isItTwo' :: (Eq a, Fractional a) => a -> Bool   
isItTwo' 2 = True  
isItTwo' _ = False

但对于Integral:

isItTwo :: Integral a => a -> Bool  
isItTwo 2 = True  
isItTwo _ = False

积分作为一个类型类不应该也在等式中吗?

IntegralFractional这样的Haskell数字类型类有时有点奇怪。

在这种情况下,恰好Integral类型的类是Real的子类,CCD_4是Ord的子类。因此,Integral a约束包含Real a, Ord a, Eq a,不需要添加这些约束。

相比之下,FractionalNum的一个子类,而不是Eq的子类,因此必须手动添加Eq

其原理不太容易猜测,但我想说FractionalNum类型类允许不相等的类型。也许有人想用Integer -> Bool这样的东西来表示某个实数的二进制数字,但这不容易比较(或打印(。毕竟,Fractional只需要fromRational,所以我们不能将分数类型转换为有理类型并进行比较

相反,Integral包含Real,后者需要toRational,因此这些类型必须是可比较的。添加Eq作为超类是有意义的,因为无论如何都必须可以进行比较。

最新更新