类型继承 Ord 类型类

Haskell 支持类扩展的概念。例如,类 Ord 继承了 Eq 中的所有操作,但另外还有一个 compare 函数,它返回值之间的 OrderingOrd 还可以包含公共顺序比较运算符,以及 min 方法和 max 方法。

=> 符号与函数签名中的含义相同,并且需要类型 a 来实现 Eq,以实现 Ord

data Ordering = EQ | LT | GT

class Eq a => Ord a where
    compare::Ord a => a -> a -> Ordering
    (<)     :: Ord a => a -> a -> Bool
    (<=)    :: Ord a => a -> a -> Bool
    (>)     :: Ord a => a -> a -> Bool
    (>=)    :: Ord a => a -> a -> Bool
    min     :: Ord a => a -> a -> a
    max     :: Ord a => a -> a -> a

compare 之后的所有方法都可以通过多种方式从中派生出来:

x < y   = compare x y == LT
x <= y  = x < y || x == y -- Note the use of (==) inherited from Eq
x > y   = not (x <= y)
x >= y  = not (x < y)

min x y = case compare x y of
               EQ -> x
               LT -> x
               GT -> y

max x y = case compare x y of
               EQ -> x
               LT -> y
               GT -> x

自己扩展 Ord 的类型类必须至少实现 compare 方法或 (<=) 方法本身,这将构建有向继承点阵。