自分で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"
うーん良い。