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