Come posso facilmente vedere l'uscita da una dichiarazione modello Haskell?
-
12-09-2019 - |
Domanda
Ho il seguente codice del modello Haskell nel mio modulo, che fa parte di un programma più ampio.
$(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, preferibilmente utilizzando solo ghci
, è possibile visualizzare l'istanza generata?
Ho provato quanto segue e ottenuto un errore di sintassi e sto indovinando questo è perché lo sto facendo ™ Sbagliato.
> derive makeFoldable ''JStatement
<interactive>:1:21:
lexical error in string/character literal at character '\''
Soluzione
ho capito. Se si passa -ddump-splices
stamperà le istanze generate al terminale durante la compilazione del modulo.
Altri suggerimenti
GHCi riporta "lexical error...
"
perché non si dispone di Template Haskell
attivato nella sessione GHCi.
È possibile attivarlo sia
passando -XTemplateHaskell
sulla riga di comando
o dall'interno GHCi sé:
ghci> :set -XTemplateHaskell
Dopo aver fissato 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,
sono disponibili diverse opzioni
per stampare le cose che sono dentro la monade Q
:
-
Usa
-ddump-splices
(Come già sottolineato in risposta di Deniz Dogan) -
Piuttosto stampare il codice Haskell generato da GHCi sé:
> putStrLn $(stringE . pprint =<< derive makeFoldable ''JStatement) instance Foldable (JStatement ...) where foldr ... = ...
-
Mostra l'attuale struttura sulla base di costruttori:
> putStrLn $(stringE . show =<< derive makeFoldable ''JStatement) [InstanceD [] (AppT (ConT Foldable) (... JStatement ...)) [...]]
Gli ultimi due potrebbero essere semplificata utilizzando runQ
,
ma questo non funziona per la generazione di codice che
utilizza alcune funzioni Template Haskell,
come le operazioni reify
.
Questo include alcuni (o forse più?) Derivazioni del pacchetto derivano.