Como posso ver facilmente a saída de uma instrução Template Haskell?
-
12-09-2019 - |
Pergunta
Eu tenho o seguinte código de modelo Haskell no meu módulo, que é parte de uma aplicação maior.
$(derive makeFoldable ''JStatement)
Eu suspeito que a instância gerada de dobrável não é exatamente o que eu originalmente tinha em mente, mas não consigo encontrar uma maneira de verificar isso. Assim, de preferência usando apenas ghci
, é possível visualizar a instância gerada?
Eu tentei o seguinte e tem um erro de sintaxe e eu estou supondo que isto é porque eu estou fazendo isso errado ™.
> derive makeFoldable ''JStatement
<interactive>:1:21:
lexical error in string/character literal at character '\''
Solução
Eu percebi isso. Se você passar -ddump-splices
ele irá imprimir as instâncias geradas ao terminal quando compilar o módulo.
Outras dicas
GHCi relata "lexical error...
"
porque você não tem Template Haskell
ativado em sua sessão GHCi.
Você pode ativá-lo, quer
passando -XTemplateHaskell
na linha de comando
ou a partir de dentro de si GHCi:
ghci> :set -XTemplateHaskell
Depois de corrigir isso, você deve obter um erro nos gostos de:
No instance for (Show DecsQ) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it
Agora,
você tem várias opções
para imprimir as coisas que estão dentro da Mônada Q
:
-
Use
-ddump-splices
(Como já foi salientado em de Deniz Dogan resposta ) -
Pretty imprimir o código Haskell gerada a partir de si GHCi:
> putStrLn $(stringE . pprint =<< derive makeFoldable ''JStatement) instance Foldable (JStatement ...) where foldr ... = ...
-
Mostrar a estrutura real baseado em construtores:
> putStrLn $(stringE . show =<< derive makeFoldable ''JStatement) [InstanceD [] (AppT (ConT Foldable) (... JStatement ...)) [...]]
Os dois últimos pode ser simplificada usando runQ
,
mas isso não funciona para a geração de código que
usa algumas funções Template Haskell,
tais como operações reify
.
Isto inclui alguns (ou talvez mais?) Derivações do pacote derivam.