¿Cómo puedo ver fácilmente la salida de un comunicado Plantilla Haskell?
-
12-09-2019 - |
Pregunta
Tengo el siguiente código de plantilla Haskell en mi módulo, que es parte de una aplicación más grande.
$(derive makeFoldable ''JStatement)
Sospecho que la instancia generada de plegable no es exactamente lo que originalmente tenía en mente, pero no puedo encontrar una manera de verificar esto. Por lo tanto, preferiblemente usando sólo ghci
, es posible ver la instancia generada?
He intentado lo siguiente y consiguió un error de sintaxis y supongo que esto es porque lo estoy haciendo ™ incorrecto.
> derive makeFoldable ''JStatement
<interactive>:1:21:
lexical error in string/character literal at character '\''
Solución
lo he descubierto. Si pasa -ddump-splices
se imprimirá las instancias generadas al terminal al compilar el módulo.
Otros consejos
GHCi informa "lexical error...
"
porque usted no tiene Plantilla Haskell
activadas en su sesión de GHCi.
Puede activarlo o bien
pasando -XTemplateHaskell
en la línea de comandos
o desde dentro de GHCi sí:
ghci> :set -XTemplateHaskell
Después de la fijación de eso, usted debe conseguir un error en la talla de:
No instance for (Show DecsQ) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it
Ahora,
usted tiene varias opciones
para imprimir las cosas que están dentro de la mónada Q
:
-
Uso
-ddump-splices
(Como ya se ha señalado en de Deniz Dogan respuesta ) -
Bastante imprimir el código generado a partir de Haskell GHCi sí:
> putStrLn $(stringE . pprint =<< derive makeFoldable ''JStatement) instance Foldable (JStatement ...) where foldr ... = ...
-
Mostrar la estructura real basado en constructores:
> putStrLn $(stringE . show =<< derive makeFoldable ''JStatement) [InstanceD [] (AppT (ConT Foldable) (... JStatement ...)) [...]]
Los dos últimos se podrían simplificar el uso de runQ
,
pero esto no funciona para la generación de código que
utiliza algunas funciones Plantilla Haskell,
tales como operaciones reify
.
Esto incluye algunos (o tal vez más?) Derivaciones del paquete de derivación.