Preferred method for viewing code generated by Template Haskell
Are you looking for the -ddump-splices
flag to the compiler?
You may be able to use pprint
or ppr
from Language.Haskell.TH.Ppr (imported automatically with Language.Haskell.TH):
GHCi> expr <- runQ [| \f g x -> f (x*2 + 3) . g |]
GHCi> putStrLn $ pprint expr
\f_0 g_1 x_2 -> f_0 ((x_2 GHC.Num.* 2) GHC.Num.+ 3) GHC.Base.. g_1
It's not pretty, but it is valid Haskell. You should be able to make the output nicer by stripping off module prefixes from Prelude names (although you might need to be careful to only strip the expected prefix; Foo.*
is a perfectly valid infix operator, after all).
As a complement to ehird answer:
Note that using runQ
directly from GHCi
in general might not work
(e.g.: TH generators that use reify
operations,
cf. comments above the runQ declaration).
When that fails, you can pprint
(or show
), transform intro a string expression stringE
then splice as an argument to putStrLn
:
> putStrLn $(stringE . pprint =<< [| \f g x -> f (x*2 + 3) . g |])
\f_0 g_1 x_2 -> f_0 ((x_2 GHC.Num.* 2) GHC.Num.+ 3) GHC.Base.. g_1