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 '\''
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top