Pergunta

Introdução:

Enquanto confira "persistente" de Snoyman Biblioteca que me vi desejando assistência de GHCI (ou outra ferramenta) para descobrir coisas.

GHCI's :info Não parece funcionar tão bem com as famílias e as famílias de dados quanto com os tipos "simples":

> :info Maybe
data Maybe a = Nothing | Just a     -- Defined in Data.Maybe
...
> :info Persist.Key Potato -- "Key Potato" defined in example below
data family Persist.Key val     -- Defined in Database.Persist
... (no info on the structure/identity of the actual instance)

Sempre se pode procurar a instância no código-fonte, mas às vezes pode ser difícil encontrá-lo e pode estar oculto no código gerado por modelos-Haskell etc.

Exemplo de código:

{-# LANGUAGE FlexibleInstances, GeneralizedNewtypeDeriving, MultiParamTypeClasses, TypeFamilies, QuasiQuotes #-}

import qualified Database.Persist as Persist
import Database.Persist.Sqlite as PSqlite

PSqlite.persistSqlite [$persist|
Potato
    name String
    isTasty Bool
    luckyNumber Int
    UniqueId name
|]

O que está acontecendo no exemplo do código acima é que o modelo-Haskell está gerando código para nós aqui. Todas as extensões acima, exceto por QuasiQuotes são necessários porque o código gerado os usa.

Eu descobri o que Persist.Key Potato está fazendo:

-- test.hs:
test = PSqlite.persistSqlite [$persist|
...
-- ghci:
> :l test.hs 
> import Language.Haskell.TH
> import Data.List
> runQ test >>= putStrLn . unlines . filter (isInfixOf "Key Potato") . lines . pprint
    where newtype Database.Persist.Key Potato = PotatoId Int64
type PotatoId = Database.Persist.Key Potato

Pergunta:

Existe uma maneira mais fácil de obter informações sobre instâncias de famílias e famílias de dados, usando GHCI ou qualquer outra ferramenta?

Foi útil?

Solução

Faz -ddump-splices Mostrar o código gerado por TH neste caso?

Por outro lado, :browse fornece informações sobre instâncias familiares de dados, embora não sobre as famílias do tipo.

Você pode querer arquivar um Bilhete de GHC - a :browse A saída parece mutilada, e pode -se esperar que as instâncias da família de dados sejam relatadas como instâncias de classe, por :info.

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