2009-04-19 14 views
10

私は大きなアプリケーションの一部である私のモジュールに次のテンプレートHaskellコードを持っています。Template Haskellの文の出力を簡単に確認するにはどうすればよいですか?

$(derive makeFoldable ''JStatement) 

私は折り畳み式の生成されたインスタンスは、私はもともと考えていたが、私はこれを確認する方法を見つけることができない、まさにではないと思われます。したがって、好ましくはghciのみを使用すると、生成されたインスタンスを表示できますか?

私は次のように試してみましたが、構文エラーがありました。これは私がDoing It Wrong™なのであると推測しています。

> derive makeFoldable ''JStatement 

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

答えて

11

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

1

GHCiセッションでTemplate Haskell が有効になっていないため、GHCiは "lexical error..." と報告しています。今

No instance for (Show DecsQ) arising from a use of ‘print’ 
In a stmt of an interactive GHCi command: print it 

:あなたが好きでエラーを取得する必要があります、という固定した後

ghci> :set -XTemplateHaskell 

: あなたはGHCiの自体の中に、コマンドライン やから-XTemplateHaskellを渡すことによって、それのいずれか をアクティブにすることができます、 Qモナドの中にあるものを印刷するには、いくつかのオプションがあります

  • 使用-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 ...)) [...]] 
    

最後2つはrunQ、 を使用して簡略化できますが、 がテンプレートHaskell関数を使用するコード生成では機能しません。 、たとえばreify操作です。 これには、派生パッケージのいくつかの(または多分?)派生が含まれます。

+1

あなたの答えは、ghciセッション内で ':set -XTemplateHaskell'と':set -ddump-splices'を実行できることを私に伝えました。私は今まで知らなかった。 – liminalisht

関連する問題