by shigemk2

当面は技術的なことしか書かない

再帰的なデータ構造

-- 代数データ型の値コンストラクタは複数のフィールドを持つことも出来るし、
-- フィールドを持たないことも出来るお
-- 各フィールドの型は具体型である必要はある。
-- そして、フィールドに持つ型は自分自身でもかまわない。
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)