2009-04-19 14 views
10

Ho il seguente codice Haskell Template nel mio modulo, che fa parte di un'applicazione più grande.Come posso vedere facilmente l'output da un'istruzione Haskell Template?

$(derive makeFoldable ''JStatement) 

ho il sospetto che l'istanza generato pieghevole non è esattamente quello che originariamente avevo in mente, ma non riesco a trovare un modo per verificare questo. Quindi, utilizzando preferibilmente solo ghci, è possibile visualizzare l'istanza generata?

Ho provato quanto segue e ho ottenuto un errore di sintassi e immagino che sia perché sto facendo It It Wrong ™.

> derive makeFoldable ''JStatement 

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

risposta

11

L'ho capito. Se si passa -ddump-splices, stamperà le istanze generate sul terminale durante la compilazione del modulo.

1

GHCi rapporti "lexical error..." perché non si dispone di Template Haskell attivato nella sessione GHCi. È possibile attivarlo o passando -XTemplateHaskell sulla riga di comando o dall'interno GHCi sé:

ghci> :set -XTemplateHaskell 

Dopo il fissaggio che, si dovrebbe ottenere un errore di artisti del calibro di:

No instance for (Show DecsQ) arising from a use of ‘print’ 
In a stmt of an interactive GHCi command: print it 

Ora , hai diverse opzioni per stampare cose che sono all'interno della monade Q:

  • Usa -ddump-splices (come già sottolineato in Deniz Dogan's answer)

  • Abbastanza stampare il codice Haskell generato da GHCi sé:

    > putStrLn $(stringE . pprint =<< derive makeFoldable ''JStatement) 
    instance Foldable (JStatement ...) 
        where foldr ... = ... 
    
  • mostrare la struttura attuale sulla base di costruttori:

    > putStrLn $(stringE . show =<< derive makeFoldable ''JStatement) 
    [InstanceD [] (AppT (ConT Foldable) (... JStatement ...)) [...]] 
    

L'ultimo due potrebbero essere semplificate usando runQ, ma questo non funziona per la generazione del codice che utilizza alcune funzioni Template Haskell, come le operazioni reify. Questo include alcune (o forse la maggior parte?) Derivazioni del pacchetto di derivazione.

+1

La tua risposta mi ha fatto capire che puoi fare ': set -XTemplateHaskell' e poi': set -ddump-splices' all'interno di una sessione ghci. Non ne avevo idea. – liminalisht

Problemi correlati