Wie kann ich leicht die Ausgabe von einer Template Haskell-Anweisung?
-
12-09-2019 - |
Frage
Ich habe folgendes Template Haskell Code in meinem Modul, das Teil einer größeren Anwendung ist.
$(derive makeFoldable ''JStatement)
Ich vermute, dass die erzeugte Instanz Faltbare nicht genau das, was ich ursprünglich im Sinne hatte, aber ich kann nicht einen Weg, um zu überprüfen diese finden. Also, vorzugsweise nur ghci
verwendet wird, ist es möglich, die erzeugten Instanz zu sehen?
habe ich versucht, den 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 '\''
Lösung
ich es herausgefunden. Wenn Sie passieren -ddump-splices
wird es die erzeugten Instanzen mit dem Anschluss drucken, wenn das Modul kompiliert wird.
Andere Tipps
GHCi berichtet "lexical error...
"
weil Sie Template Haskell nicht
in Ihrer GHCi Sitzung aktiviert.
Sie können es entweder aktivieren
durch -XTemplateHaskell
auf der Befehlszeile Passieren
oder von innen GHCi selbst:
ghci> :set -XTemplateHaskell
Danach repariert ist, 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
Nun,
Sie haben mehrere Möglichkeiten,
drucken Dinge, die im Inneren des Q
Monade sind:
-
Verwenden
-ddump-splices
(Wie bereits erwähnt in Deniz Dogan Antwort ) -
Pretty den erzeugten Haskell-Code von GHCi drucken selbst:
> putStrLn $(stringE . pprint =<< derive makeFoldable ''JStatement) instance Foldable (JStatement ...) where foldr ... = ...
-
Zeigen Sie die aktuelle Struktur auf Basis von Konstrukteuren:
> putStrLn $(stringE . show =<< derive makeFoldable ''JStatement) [InstanceD [] (AppT (ConT Foldable) (... JStatement ...)) [...]]
Die letzten beiden könnte vereinfacht werden, indem runQ
,
Dies funktioniert jedoch nicht für die Codegenerierung, dass
verwendet einige Template Haskell Funktionen,
wie reify
Operationen.
Dazu gehören einige (oder vielleicht die meisten?) Ableitungen des derive Paket.