Comment puis-je voir facilement la sortie d'un modèle Haskell déclaration?
-
12-09-2019 - |
Question
J'ai le code Haskell modèle suivant dans mon module, qui fait partie d'une plus grande application.
$(derive makeFoldable ''JStatement)
Je soupçonne que l'instance de produit Pliable n'est pas exactement ce que j'avais à l'origine à l'esprit, mais je ne peux pas trouver un moyen de le vérifier. Ainsi, en utilisant uniquement ghci
de préférence, est-il possible de voir l'instance générée?
J'ai essayé ce qui suit et eu une erreur de syntaxe et je devine que c'est parce que je le fais mal ™.
> derive makeFoldable ''JStatement
<interactive>:1:21:
lexical error in string/character literal at character '\''
La solution
Je compris. Si vous passez -ddump-splices
il imprimera les instances générées au terminal lors de la compilation du module.
Autres conseils
GHCi rapports "lexical error...
"
parce que vous n'avez pas de modèle Haskell
activé dans votre session GHCi.
Vous pouvez l'activer soit
en faisant passer -XTemplateHaskell
sur la ligne de commande
ou à partir d'elle-même GHCi:
ghci> :set -XTemplateHaskell
Après avoir fixé, vous devriez obtenir une erreur dans les goûts de:
No instance for (Show DecsQ) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it
Maintenant,
vous avez plusieurs options
d'imprimer des choses qui sont à l'intérieur du Q
monade:
-
Utilisez
-ddump-splices
(Comme déjà souligné dans réponse de Deniz Dogan) -
imprimer Jolie le code Haskell généré à partir GHCi lui-même:
> putStrLn $(stringE . pprint =<< derive makeFoldable ''JStatement) instance Foldable (JStatement ...) where foldr ... = ...
-
Afficher la structure réelle basée sur les constructeurs:
> putStrLn $(stringE . show =<< derive makeFoldable ''JStatement) [InstanceD [] (AppT (ConT Foldable) (... JStatement ...)) [...]]
Les deux derniers pourraient être simplifié en utilisant runQ
,
mais cela ne fonctionne pas pour la génération de code
utilise certaines fonctions Modèle Haskell,
telles que les opérations de reify
.
Cela inclut certains (ou peut-être plus?) Dérivations du paquet derive.