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

$(derive makeFoldable ''JStatement)

我怀疑所产生的实例可折叠是不完全是我原先想的,但我不能找到一种方法来验证这一点。因此,最好只使用 ghci, ,是否有可能查所产生的实例?

我试过了以下,并得到了语法错误和我猜这是因为我这样做是错误的程序。

> derive makeFoldable ''JStatement

<interactive>:1:21:
    lexical error in string/character literal at character '\''
有帮助吗?

解决方案

我计算出来。如果传递-ddump-splices编译模块时,将打印所生成的实例终端。

其他提示

GHCi报告"lexical error..." 因为你没有模板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 单:

  • 使用 -ddump-splices (如已经指出的, Deniz Dogan的答案)

  • 漂亮的打印所产生的Haskell的代码GHCi本身:

    > 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 操作。这包括一些(也许大多?) 派生的派生软件包。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top