40 votes

Méthode préférée pour afficher le code généré par le modèle Haskell

Comme vous le savez, le Modèle de Haskell est utilisé pour générer différents types de AST épissures par programme au moment de la compilation.

Cependant, une épissure peut souvent être très opaque, et il est souvent difficile de discerner ce qu'une épissure génère en fait. Si vous exécutez l' Q monade pour une épissure, et que le raccord est bien tapé, vous obtenez un showmesure de la représentation de la pièce de l'AST, mais cette représentation peut être très difficile à comprendre, en raison de sa non structurées mise en page.

Quelle est la méthode préférée pour la conversion d'un morceau de TH généré AST dans quelque chose qui s'apparente à la normale du code Haskell, de sorte que le code peut être facilement lu et compris? Peut-on reconstituer le code source, par exemple, d'un Dec de la valeur? A-t-on à lire le GHC code de Base? Est-il possible au moins de la structure de l'AST, de sorte qu'il devient plus lisible (au-Delà de ce que par exemple l' pretty-show colis n')?

52voto

augustss Points 15750

Recherchez-vous l'indicateur -ddump-splices du compilateur?

22voto

ehird Points 30215

Vous pouvez être en mesure d'utiliser pprint ou ppr de la Langue.Haskell.TH.Ppr (importés automatiquement avec la Langue.Haskell.TH):

GHCi> expr <- runQ [| \f g x -> f (x*2 + 3) . g |]
GHCi> putStrLn $ pprint expr
\f_0 g_1 x_2 -> f_0 ((x_2 GHC.Num.* 2) GHC.Num.+ 3) GHC.Base.. g_1

C'est pas joli, mais c' est valable Haskell. Vous devriez être en mesure de rendre la sortie plus agréable en retirant le module de préfixes de Prélude noms (bien que vous pourriez avoir besoin de faire attention à seule bande attendus préfixe; Foo.* est parfaitement valide opérateur infixe, après tout).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X