如何轻松查看Template Haskell语句的输出?

时间:2009-04-19 19:03:45

标签: haskell metaprogramming ghc template-haskell

我的模块中有以下模板Haskell代码,它是更大应用程序的一部分。

$(derive makeFoldable ''JStatement)

我怀疑生成的Foldable实例并不是我最初的想法,但我找不到验证方法。因此,最好只使用ghci,是否可以查看生成的实例?

我尝试了以下操作并出现语法错误,我猜这是因为我做错了。

> derive makeFoldable ''JStatement

<interactive>:1:21:
    lexical error in string/character literal at character '\''

2 个答案:

答案 0 :(得分:11)

我明白了。如果您传递-ddump-splices,它将在编译模块时将生成的实例打印到终端。

答案 1 :(得分:1)

GHCi报告“lexical error...” 因为你没有Template Haskell 在GHCi会话中激活。 你也可以激活它     在命令行上传递-XTemplateHaskell     或者来自GHCi本身:

ghci> :set -XTemplateHaskell

修好后,您应该收到以下错误:

No instance for (Show DecsQ) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it

现在, 你有几个选择 打印Q monad中的内容:

  • 使用-ddump-splices (已在Deniz Dogan's answer中指出)

  • 从GHCi本身打印生成的Haskell代码:

    > putStrLn $(stringE . pprint =<< derive makeFoldable ''JStatement)
    instance Foldable (JStatement ...)
      where foldr ... = ...
    
  • 根据构造函数显示实际结构:

    > putStrLn $(stringE . show =<< derive makeFoldable ''JStatement)
    [InstanceD [] (AppT (ConT Foldable) (... JStatement ...)) [...]]
    

最后两个可能会使用runQ进行简化, 但这不适用于代码生成 使用一些Template Haskell函数, 例如reify操作。 这包括派生包的一些(或者可能是大多数?)派生。