Concurrent Crean 1部3章続き
代数データ型
:: Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun
datatype。列挙する。
多相ツリー型
:: Tree a = Node a (Tree a) (Tree a) | Leaf
ツリーデータ
Node 7 (Node 3 (Node 5 Leaf Leaf ) Leaf ) Leaf
パターン形式の関数定義
sizeT :: Tree a -> Int sizeT Leaf = 0 sizeT (Node x p q) = 1 + sizeT p + sizeT q
クラスEq、Ord
要素が昇順になっているということを想定できるならば、幾分か便利になる。求められている要素を渡すと、探索を止めることができる。結果として、その要素は比較可能であるだけでなく(クラスEq)、整列可能でなければならない(クラスOrd)。 elem' :: a [a] -> Bool | Eq, Ord a elem' e [] = False elem' e [x:xs] = e == x || (e > x && elem' e xs)
つまりEqは==、Ordは>が使えるということ。
抽象データ型
ここからはモジュール。
definition module stack :: Stack a Empty :: (Stack a) isEmpty :: (Stack a) -> Bool Top :: (Stack a) -> a Push :: a (Stack a) -> Stack a Pop :: (Stack a) -> Stack a
stackモジュールのdefinitionには、型名とそれを使う関数の型だけを列挙する。
implementation module stack :: Stack a :== [a] Empty :: (Stack a) Empty = [] isEmpty :: (Stack a) -> Bool isEmpty [] = True isEmpty s = False Top :: (Stack a) -> a Top [e:s] = e Push :: a (Stack a) -> Stack a Push e s = [e:s] Pop :: (Stack a) -> Stack a Pop [e:s] = s
implementationで実態を書く。