うあー

・Preludeには変な関数がはいってるよな〜とか
http://www.zvon.org/other/haskell/Outputprelude/index.html
recipとか、(1/n)の方が短いし、いらないじゃんと思うけど、なんであるんだろう。readParenとか何する関数なのかもよくわからん


・昔のTemplate haskellには、gensymという、そのまんまの関数があったような
http://www.cis.upenn.edu/~bcpierce/courses/advprog/resources/haskell-src/Language.Haskell.THSyntax.html#v%3Agensym
2002年くらいのSimon Peyton Jonesだかの論文読むと普通にgensymを使ってらっしゃる。今はないな〜とか思って、探して見たら、newNameという関数があって、これが代わりを果たすっぽい。gensymのがタイプしやすいんだが

gensym::String->Q String
mkName::String->Name
newName::String-> Q Name


・Template Haskellは、もうちょっとだけ、deSugarしてくれてもいいんじゃないかと思った

Prelude> :set prompt >
> :module + Language.Haskell.TH
> :set -fth
> runQ[| 3:[] |]>>=print
InfixE (Just (LitE (IntegerL 3))) (ConE GHC.Base.:) (Just (ConE GHC.Base.[]))
> runQ[| (:) 3 [] |]>>=print
AppE (AppE (ConE GHC.Base.:) (LitE (IntegerL 3))) (ConE GHC.Base.[])


・declarationのASTを見たいときも

> runQ[d| x=1;f x y=x+n where n=3 |]>>=print
[ValD (VarP x) (NormalB (LitE (IntegerL 1))) [],FunD f [Clause [VarP x_3,VarP y_4] (NormalB (InfixE (Just (VarE x_3)) (VarE GHC.Num.+) (Just (VarE n_5)))) [ValD (VarP n_5) (NormalB (LitE (IntegerL 3))) []]]]


・リストの内包表記。って嫌いだったんだけどなんか好きになれそうな気がした

(\a b -> [(x,y)|x<-a,y<-b,y-x<4]) [1,2,3] [4,5,6]

mapとかだけで書くと、何やってるか分かりづらくなることは多々あるな〜と