自分でList

finger treeの論文の最初の方読んでて、何やら適当な型を渡してやるとGHCがKind mis-matchとか出てきてなんでだろなーとか考える次第だったので、取りあえずGHCiで :t []とかみっともない事をやると。

*Main> :t []
[] :: [a]

とか出てきた。


なんかピンと来ないので

*Main> :i []
data [] a = [] | a : [a] 	-- Defined in GHC.Base
...

でああそうか"[]"ていうのはdata constructorに過ぎないのかほへーという感じで。


でこの辺りから脱線してきて。
そしてこの記事
http://itpro.nikkeibp.co.jp/article/COLUMN/20061031/252259/

Listは,無引数のデータ構成子[],または「型変数aの値」と「型変数aの値を持つリスト」を持つ
中置データ構成子(:)で構成されているのがわかります。

記事から一部抜粋

とあって、(:)とかそもそもList周りってspecial formなのかなーとか考えていたのですが、単純にinfix data constructorなのかとかいうことで、本当に書けちゃうのかという事でMyList型を作ってみた。

infixr 5 `Cons`
data MyList a = MyList |  a `Cons` (MyList a)

myList2Str :: MyList a -> [a]
myList2Str (a `Cons` b) = (a:[]) ++ myList2Str b
myList2Str MyList       = []

*Main> show $ myList2Str $ 1 `Cons` 2 `Cons` 3 `Cons` MyList
"[1,2,3]"

*Main> print $ myList2Str $ 'H' `Cons` 'a' `Cons` 's' `Cons` 'k' `Cons` 'e' `Cons` 'l' `Cons` 'l' `Cons` MyList
"Haskell"

うーん良い。