top page > computer > haskell > web_lecture > for_programmer > typeclass_ord.html
更新日:
文責: 重城良国

型クラス: Ord

(工事中 70%)

大小比較

型クラスOrdは「大小比較が可能」という性質を表す。以下のように定義されている。

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

compare x y
| x == y = EQ
| x >= y = LT
| otherwise = GT

x <= y = compare x y /= GT
x < y = compare x y == LT
x >= y = compare x y /= LT
x > y = compare x y == GT

max x y
| x <= y = y
| otherwise = x
min x y
| x <= y = x
| otherwise = y

関数compareまたは演算子(<=)のどちらかを定義すれば他はデフォルト定義が使える。`Eq a =>'はクラス制約である。クラス宣言にクラス制約をつけると型変数に特定のクラスに属していることという制約をつけることができる。この場合は「大小比較するためには、すくなくとも等値比較できる必要がある」ということだ。

ドリンクのサイズ

drinkSize.hs

instance Ord Size where
Short <= _ = True
_ <= Short = False
Tall <= _ = True
_ <= Tall = False
Grande <= _ = True
_ <= Grande = False
_ <= _ = True

すべてのサイズはShort以上なのでShort <= _はTrueだ。次に左辺にはもうShortは来ないので_ <= ShortはFalseとなる。ここでShortは左右のどちらかに来るパターンは網羅した。すると残りのすべてのサイズはTall以上なのでTall <= _はTrueだ。次に左辺にはもうTallは来ないので_ <= TallはFalseとなる。Grandeについても同様だ。最後の_ <= _は残りのVenti <= Ventiを処理する。

試してみる。

% ghci drinkSize.hs
*Main> Tall < Grande
True
*Main> compare Short Venti
LT

「型クラス: Eq」へもどる 「構文: infix」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics