dfl*_*str 40 haskell pretty-print ghc template-haskell
如您所知,Template Haskell用于在编译时以编程方式生成各种AST拼接.
然而,拼接通常可能非常不透明,并且通常难以辨别拼接实际生成的内容.如果你运行Q
monad进行拼接,并且拼接是良好类型的,你可以很好地show
表示生成的AST片段,但由于其非结构化布局,这种表示很难理解.
将TH生成的AST转换为类似于普通Haskell代码的首选方法是什么,以便可以轻松读取和理解代码?可以从例如给定Dec
值重建源代码吗?是否必须阅读GHC核心代码?有没有办法至少构建AST,使其变得更具可读性(超出pretty-show
包裹的范围)?
aug*_*tss 52
你在寻找-ddump-splices
编译器的标志吗?
ehi*_*ird 22
您可以使用pprint
或ppr
从Language.Haskell.TH.Ppr(带自动导入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
Run Code Online (Sandbox Code Playgroud)
它不漂亮,但它是有效的Haskell.你应该能够通过从Prelude名称中删除模块前缀来使输出更好(尽管你可能需要小心只去掉预期的前缀; Foo.*
毕竟是一个完全有效的中缀运算符).