THその5とかだっけ
そのまま書くと、このクソ記事がググった時に上位に出て来ると困るので略称で。(まぁLanguage.Haskell.THにもなってるからちゃんとした略称ですが)
THにはちょっと不便な事に、関数の引数でリストパターンを素直に使う事が出来ません。
例えば
tuple2 (a:b:[]) = (a,b)
みたいな。
リストはHaskellのdataとしてちゃんと定義されているので、その辺の事が分かっていれば上の関数をTHを使って
LamE [InfixP (VarP $ mkName "a") (mkName "GHC.Base.:") (InfixP (VarP $ mkName "b") (mkName "GHC.Base.:") (ConP (mkName "GHC.Base.[]") []))] (TupE [VarE $ mkName "a",VarE $ mkName "b"])
と書く事が出来ます。