2009-04-19 65 views
10

我的模块中有以下模板Haskell代码,这是更大的应用程序的一部分。如何轻松查看模板Haskell语句的输出?

$(derive makeFoldable ''JStatement) 

我怀疑是可折叠的所生成的背景不完全是原来脑子里想我,但我不能找到一种方法来验证这一点。所以,最好只使用ghci,是否可以查看生成的实例?

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

> derive makeFoldable ''JStatement 

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

回答

11

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

1

GHCI报告“lexical error...” 因为你没有模板哈斯克尔 在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'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, 来简化两个,但是这对于 使用一些模板哈斯克尔功能, 例如reify操作的代码生成不起作用。 这包括派生包的一些(或可能是大多数?)派生。

+1

你的回答告诉我你可以在ghci会话中执行`:set -XTemplateHaskell`然后`:set -ddump-splices`。我不知道。 – liminalisht 2016-03-17 15:58:59