Template Haskell ステートメントからの出力を簡単に確認するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/765902

質問

私のモジュールには次の 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 オペレーション。これには、派生パッケージの一部 (またはほとんど?) 派生版が含まれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top