我怎么可以容易地看出,从一个模板,Haskell的声明吗?
-
12-09-2019 - |
题
我有以下模板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
操作。这包括一些(也许大多?) 派生的派生软件包。
不隶属于 StackOverflow