2009-04-19 3 views
10

Tengo el siguiente código de Plantilla Haskell en mi módulo, que es parte de una aplicación más grande.¿Cómo puedo ver fácilmente el resultado de una declaración de Template Haskell?

$(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. Entonces, preferiblemente usando solo ghci, ¿es posible ver la instancia generada?

Intenté lo siguiente y obtuve un error de sintaxis y supongo que esto se debe a que estoy haciendo las cosas mal ™.

> derive makeFoldable ''JStatement 

<interactive>:1:21: 
    lexical error in string/character literal at character '\'' 

Respuesta

11

Lo descubrí. Si pasa -ddump-splices imprimirá las instancias generadas al terminal al compilar el módulo.

1

GHCi informa "lexical error..." porque no tiene Plantilla Haskell activado en su sesión de GHCi. Puede activarlo o bien pasando -XTemplateHaskell en la línea de comandos o desde dentro GHCi sí:

ghci> :set -XTemplateHaskell 

Después de arreglar eso, usted debe obtener 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 , tiene varias opciones para imprimir cosas que están dentro de la mónada Q:

  • Uso -ddump-splices (como ya se ha señalado en Deniz Dogan's answer)

  • Bastante imprimir el código Haskell generado a partir de sí mismo GHCi:

    > 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 ...)) [...]] 
    

Último dos pueden simplificarse usando runQ, pero esto no funciona para la generación de código que usa algunas funciones de Template Haskell, como operaciones reify. Esto incluye algunas (¿o quizás la mayoría?) Derivaciones del paquete derivado.

+1

Tu respuesta me avisó del hecho de que puedes hacer ': set -XTemplateHaskell' y luego': set -ddump-splices' dentro de una sesión ghci. No tenía ni idea. – liminalisht

Cuestiones relacionadas