簡潔な答え
Num
それがプレリュードの定義だからです:
class Num a where
...
の定義でIntegral
は、タイプがReal
and である必要がありEnum
ます。
class (Real a, Enum a) => Integral a where
...
そして両方をReal
意味します...Num
Ord
class (Num a, Ord a) => Real a where
...
そしてOrd
、当然のことながら、次のことを意味しEq
ます。
class Eq a => Ord a where
...
この行は、何かを実装するためにはOrd
、それも実装する必要Eq
があることを意味します。Ord
または、 のサブクラスであると言えEq
ます。ともかく...
要約すると、は のサブクラスでNum
はなく、のサブクラスです。Eq
Integral
Eq
長い答え(なぜ?)
Num
実装を不可能にする方法で実装することは想像できますEq
。
newtype Sequence = Sequence (Integer -> Integer)
instance Num Sequence where
(Sequence x) + (Sequence y) = Sequence $ \pt -> x pt + y pt
(Sequence x) - (Sequence y) = Sequence $ \pt -> x pt - y pt
(Sequence x) * (Sequence y) = Sequence $ \pt -> x pt * y pt
negate (Sequence x) = Sequence $ \pt -> -pt
abs (Sequence x) = Sequence $ \pt -> abs pt
signum (Sequence x) = Sequence $ \pt -> signum pt
fromInteger = Sequence . const
-- Ignore the fact that you'd implement these methods using Applicative.
ここで、Sequence
は計算可能なすべてのシーケンスを表す型です。Eq
シーケンスが無限に長いため、合理的な方法で実装することはできません!
instance Eq Sequence where
-- This will never return True, ever.
(Sequence x) == (Sequence y) =
and [x pt == y pt | pt <- [0..]] &&
and [x pt == y pt | pt <- [-1,-2..]]
Num
したがって、が のサブクラスではないことは理にかなっています。Eq
なぜなら、を実装できるが を実装できない便利な型があるからです。Num
Eq