我的模块中有以下模板Haskell代码,它是更大应用程序的一部分。
$(derive makeFoldable ''JStatement)
我怀疑生成的Foldable实例并不是我最初的想法,但我找不到验证方法。因此,最好只使用ghci
,是否可以查看生成的实例?
我尝试了以下操作并出现语法错误,我猜这是因为我做错了。
> derive makeFoldable ''JStatement
<interactive>:1:21:
lexical error in string/character literal at character '\''
答案 0 :(得分:11)
我明白了。如果您传递-ddump-splices
,它将在编译模块时将生成的实例打印到终端。
答案 1 :(得分:1)
GHCi报告“lexical error...
”
因为你没有Template 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
monad中的内容:
使用-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
进行简化,
但这不适用于代码生成
使用一些Template Haskell函数,
例如reify
操作。
这包括派生包的一些(或者可能是大多数?)派生。