練習問題 4.2.13
連接はリスト上の基本操作であるように見えるので,連接をプリミティブとしてデータ型を構成してみよう. たとえば,
data CatList a = Nil | Wrap a | Cat (CatList a) (CatList a)
とする.
Nilは
[],
Wrap xは
[x],
Cat xs ysは
xs++ysをそれぞれ表すためのものである.しかし,
++は結合性のある演算子なので,以下の2つの式は等しいとみなすべきである.
Cat xs (Cat ys zs) と Cat (Cat xs ys) zs
CatListについて
Eqクラスのインスタンスと
Ordクラスのインスタンスを適切に定義せよ.
toList :: CatList a -> [a]
toList Nil = []
toList (Wrap x) = [x]
toList (Cat Nil ys) = toList ys
toList (Cat (Wrap x) ys) = x : toList ys
toList (Cat (Cat xs xs') ys) = toList xs ++ toList (Cat xs' ys)
instance Eq a => Eq (CatList a) where
xs == ys = toList xs == toList ys
instance Ord a => Ord (CatList a) where
xs <= ys = toList xs <= toList ys