2009-04-19 8 views
10

Ich habe den folgenden Vorlage Haskell-Code in meinem Modul, das Teil einer größeren Anwendung ist.Wie kann ich die Ausgabe einer Template Haskell-Anweisung leicht sehen?

$(derive makeFoldable ''JStatement) 

Ich vermute, dass die erzeugte Instanz Faltbare nicht genau das, was ich ursprünglich im Sinn hatte, aber ich kann nicht einen Weg, um zu überprüfen diese finden. Also, vorzugsweise mit nur ghci, ist es möglich, die generierte Instanz zu sehen?

Ich habe versucht, die folgenden und bekam einen Syntaxfehler und ich vermute, das ist, weil ich es falsch ™ mache.

> derive makeFoldable ''JStatement 

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

Antwort

11

Ich fand es heraus. Wenn Sie -ddump-splices übergeben, werden die generierten Instanzen beim Kompilieren des Moduls an das Terminal gedruckt.

1

GHCi berichtet "lexical error..." weil Sie Template Haskell nicht in Ihrer GHCi Sitzung aktiviert haben. Sie können es aktivieren entweder durch -XTemplateHaskell auf der Kommandozeile oder aus GHCi vorbei selbst:

ghci> :set -XTemplateHaskell 

Nach dem Fixieren, dass, sollten Sie einen Fehler in den Gleichen von:

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

Jetzt , Sie haben mehrere Optionen , um Dinge zu drucken, die in der Q Monade sind:

  • Verwenden -ddump-splices (Wie bereits in Deniz Dogan's answer out)

  • Recht des erzeugten Haskell-Code von GHCi selbst drucken:

    > putStrLn $(stringE . pprint =<< derive makeFoldable ''JStatement) 
    instance Foldable (JStatement ...) 
        where foldr ... = ... 
    
  • zeigen die tatsächliche Struktur auf Basis von Konstrukteuren:

    > putStrLn $(stringE . show =<< derive makeFoldable ''JStatement) 
    [InstanceD [] (AppT (ConT Foldable) (... JStatement ...)) [...]] 
    

Die letzte Zwei können unter Verwendung von runQ, vereinfacht werden, aber dies funktioniert nicht für die Codegenerierung, die einige Template Haskell Funktionen verwendet, wie reify Operationen. Dies beinhaltet einige (oder vielleicht die meisten?) Ableitungen des Ableitungs-Pakets.

+1

Ihre Antwort gab mir die Tatsache ab, dass Sie tun 'können: set -XTemplateHaskell' und dann': Sets innerhalb einer GHCI Sitzung -ddump-splices'. Ich hatte keine Ahnung. – liminalisht

Verwandte Themen