Template Haskell
コンパイル時に展開される
構文解析時に展開される
Language.Haskell.TH
モジュールを使う
hs{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH
関数
runQ
HaskellコードからHaskell ASTを生成する
出力InfixE
(Just (LitE (IntegerL 1)))
(VarE GHC.Num.+)
(Just (LitE (IntegerL 2)))
ppr
Haskell ASTからHaskellコードを生成する
しかし runQ
の出力をそのままとれるわけではなく GHC.Num.+
などは '(GHC.Num.+)
と書く必要がある
$(..)
eval
..
の部分にクオート式を書く
クォート式の Q
がそれ
クォート式
式クォート
[| .. |] :: Q Exp
または [e| .. |]
宣言クォート
[d| .. |] :: Q [Dec]
top-levelの宣言を書く
hs[d| main = putStrLn "Hello" |] --> Hello
型クォート
[t| .. |] :: Q Type
パターンクォート
[p| ... |] :: Q Pat
ユースケース
コンパイル時評価
ちょっと特殊なケース?
Haskellで文字列フォーマットをやる
"{hoge}です"
みたいなやつ
[format|{_1}, {_2}!|] $ ("hello", "world")
assertのエラーメッセージに、問題の式を含める
let !x = [assert|a == "hello" && b > 9999999|]
[parseRoutes| / HomeR GET |]
参考
概要
最初に読むやつ