generated at
Template Haskell
Haskellのmacro
コンパイル時に展開される
構文解析時に展開される
Language.Haskell.TH モジュールを使う


hs
{-# LANGUAGE TemplateHaskell #-} import Language.Haskell.TH



関数
runQ
HaskellコードからHaskell ASTを生成する
例hs
runQ [e|1+2|]
出力
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


オレオレクオート式を自作する
QuasiQuotesを使う



ユースケース
コンパイル時評価
ちょっと特殊なケース?
Haskellで文字列フォーマットをやる
"{hoge}です" みたいなやつ
[format|{_1}, {_2}!|] $ ("hello", "world")
assertのエラーメッセージに、問題の式を含める
let !x = [assert|a == "hello" && b > 9999999|]
[parseRoutes| / HomeR GET |]


参考
概要
最初に読むやつ