Lisp のセルみたいなものを定義してみる。

Cell は Symbol型の car と cdr の値を持つ。

Symbol型は Int または String、Nil、そして、Cell 型である。


data Symbol = I Int | S String | Nil | C Cell deriving (Show, Read, Eq)

data Cell = Cell { car :: Symbol, cdr :: Symbol} deriving (Show, Read, Eq)

Prelude> :load lisp.hs
[1 of 1] Compiling Main ( lisp.hs, interpreted )
Ok, modules loaded: Main.
-- セル a の car に文字列 "Hello" cdr に Nil
*Main> let a = Cell{car=S "Hello" ,cdr=Nil}
*Main> a
Cell {car = S "Hello", cdr = Nil}
-- セル b の car に文字列 "World!" cdr に Nil
*Main> let b = Cell{car=S "World!" ,cdr=Nil}
*Main> b
Cell {car = S "World!", cdr = Nil}

-- セル a の cdr に セル b を定義して連結
*Main> let c = a{ cdr = C b }
*Main> c
Cell {car = S "Hello", cdr = C (Cell {car = S "World!", cdr = Nil})}

car に Symbol型 の a 、cdr に Symbol型 の b を設定した Cell を返す cons 関数を定義してみる。


cons a b = Cell { car = a, cdr = b}

*Main> let cell = cons (S "123") Nil
*Main> cell
Cell {car = S "123", cdr = Nil}

*Main> let list = cons (S "World!") (C cell)
*Main> list
Cell {car = S "World!", cdr = C (Cell {car = S "123", cdr = Nil})}
-- 型の要素名で取り出せるから
*Main> car list
S "World!"
*Main> cdr list
C (Cell {car = S "123", cdr = Nil})