As you know, Template Haskell is used to generate various kinds of AST splices programmatically at compile-time.
However, a splice can often be very opaque, and it is often difficult to discern what a splice actually generates. If you run the Q
monad for a splice, and the splice is well-typed, you get a show
able representation of the generated piece of AST, but this representation can be very difficult to understand, because of its unstructured layout.
What is the preferred method for converting a piece of TH-generated AST into something akin to normal Haskell code, so that the code can be easily read and understood? Can one reconstruct source code from e.g. a given Dec
value? Does one have to read the GHC Core code? Is there a way to at least structure the AST so that it becomes more readable (Beyond what e.g. the pretty-show
package does)?
Are you looking for the
-ddump-splices
flag to the compiler?You may be able to use
pprint
orppr
from Language.Haskell.TH.Ppr (imported automatically with Language.Haskell.TH):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 usereify
operations, cf. comments above the runQ declaration).When that fails, you can
pprint
(orshow
), transform intro a string expressionstringE
then splice as an argument toputStrLn
: