2009-04-19 45 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