Template Haskell ステートメントからの出力を簡単に確認するにはどうすればよいですか?
-
12-09-2019 - |
質問
私のモジュールには次の Template Haskell コードがあります。これはより大きなアプリケーションの一部です。
$(derive makeFoldable ''JStatement)
生成された Foldable のインスタンスは、当初考えていたものとまったく異なるのではないかと思われますが、これを確認する方法が見つかりません。したがって、できれば使用するのは ghci
, 、生成されたインスタンスを表示することはできますか?
次のことを試したところ、構文エラーが発生しました。これは、Doing It Wrong™ が原因であると思われます。
> derive makeFoldable ''JStatement
<interactive>:1:21:
lexical error in string/character literal at character '\''
解決
私はそれを考え出しました。あなたが-ddump-splices
を渡した場合、モジュールをコンパイルするときには、端末に生成されたインスタンスを印刷します。
他のヒント
GHCiは「lexical error...
「GHCIセッションでテンプレートHaskellがアクティブ化されていないためです。通過することでそれをアクティブにすることができます -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
(すでに指摘したように、 デニズ・ドーガンの答え)GHCi 自体から生成された Haskell コードをそのまま出力します。
> putStrLn $(stringE . pprint =<< derive makeFoldable ''JStatement) instance Foldable (JStatement ...) where foldr ... = ...
コンストラクターに基づいて実際の構造を表示します。
> putStrLn $(stringE . show =<< derive makeFoldable ''JStatement) [InstanceD [] (AppT (ConT Foldable) (... JStatement ...)) [...]]
最後の 2 つは次のように簡略化できます。 runQ
、しかし、これはいくつかのテンプレートHaskell関数を使用するコード生成では機能しません。 reify
オペレーション。これには、派生パッケージの一部 (またはほとんど?) 派生版が含まれます。