うあー
・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とかだけで書くと、何やってるか分かりづらくなることは多々あるな〜と