-- 代数データ型の値コンストラクタは複数のフィールドを持つことも出来るし、 -- フィールドを持たないことも出来るお -- 各フィールドの型は具体型である必要はある。 -- そして、フィールドに持つ型は自分自身でもかまわない。 infixr 5 :-: -- 結合性 data List a = Empty | a :-: (List a) deriving (Show, Read, Eq, Ord) -- *Main> 3 :-: 4 :-: 5 :-: Empty -- 3 :-: (4 :-: (5 :-: Empty)) -- *Main> let a = 3 :-: 4 :-: 5 :-: Empty -- *Main> 100 :-: a -- 100 :-: (3 :-: (4 :-: (5 :-: Empty))) -- *Main> 100 :-: a -- 100 :-: (3 :-: (4 :-: (5 :-: Empty))) -- 標準のリストにおける++の定義はこうなっておる -- infixr 5 ++ -- (++) :: [a] -> [a] -> [a] -- [] ++ ys = ys -- (x:xs) ++ ys = x : (xs ++ ys) infixr 5 ^++ (^++) :: List a -> List a -> List a Empty ^++ ys = ys (x :-: xs) ^++ ys = x :-: (xs ^++ ys)