11

私のモジュールには、より大きなアプリケーションの一部である次のテンプレートHaskellコードがあります。

$(derive makeFoldable ''JStatement)

生成されたFoldableのインスタンスは、私が最初に考えていたものとは正確に一致していないと思われますが、これを確認する方法が見つかりません。したがって、できれば、のみを使用してghci、生成されたインスタンスを表示することは可能ですか?

次のことを試しましたが、構文エラーが発生しました。これは、DoingItWrong™を使用しているためだと思います。

> derive makeFoldable ''JStatement

<interactive>:1:21:
    lexical error in string/character literal at character '\''
4

2 に答える 2

12

私はそれを考え出した。渡す-ddump-splicesと、モジュールのコンパイル時に生成されたインスタンスが端末に出力されます。

于 2009-04-19T19:30:53.517 に答える
3

lexical error...GHCiセッションでテンプレート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 ですでに指摘されているように)

  • 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が、これは、操作などの一部のTemplateHaskell関数を使用するコード生成では機能しませんreify。これには、派生パッケージのいくつかの(またはおそらくほとんどの?)派生が含まれます。

于 2015-12-14T21:42:39.063 に答える