11

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

$(derive makeFoldable ''JStatement)

我怀疑生成的 Foldable 实例并不完全是我最初的想法,但我找不到验证这一点的方法。那么,最好只使用ghci,是否可以查看生成的实例?

我尝试了以下并得到一个语法错误,我猜这是因为我做错了™。

> derive makeFoldable ''JStatement

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

2 回答 2

12

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

于 2009-04-19T19:30:53.517 回答
3

GHCi 报告“ lexical error...”,因为您没有在 GHCi 会话中激活 Template Haskell。您可以通过-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

现在,您有几个选项可以打印Qmonad 中的内容:

  • 使用(正如Deniz Dogan 的回答-ddump-splices 中已经指出的那样)

  • 漂亮地打印 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,但这不适用于使用一些模板 Haskell 函数的代码生成,例如reify操作。这包括派生包的一些(或者可能是大多数?)派生。

于 2015-12-14T21:42:39.063 回答