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 '\''
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top