Informazioni sulle istanze della famiglia tipo
-
26-09-2019 - |
Domanda
Introduzione:
Mentre il check-out di snoyman "persistente" biblioteca mi sono trovato a voler ghci del (o un altro strumento) assistenza per cercare di capire cose.
:info
delle ghci non sembra funzionare come bene con tipo-famiglie e data-famiglie come fa con i tipi di "semplice":
> :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)
Si può sempre cercare l'istanza nel codice sorgente, ma a volte potrebbe essere difficile da trovare e può essere nascosto nella template-Haskell codice generato etc.
Esempio di codice:
{-# 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
|]
Che cosa sta succedendo nel codice di esempio sopra è che Template-Haskell sta generando codice per noi qui. Tutte le estensioni sopra tranne QuasiQuotes
sono necessari perché il codice generato li utilizza.
ho scoperto cosa Persist.Key Potato
è facendo:
-- 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
Domanda:
C'è un modo più semplice per ottenere informazioni sulle istanze di famiglie e famiglie di tipo di dati, utilizzando ghci o qualsiasi altro strumento?
Soluzione
non -ddump-splices
vi mostrerà il codice TH-generato in questo caso?
In caso contrario, :browse
ti dà informazioni sulle istanze della famiglia di dati, anche se non si tratta di famiglie tipo.
Si potrebbe desiderare di presentare una GHC biglietto - gli sguardi di uscita :browse
alterati, e uno potrebbe aspettare casi familiari dati da comunicare come istanze di classe, da :info
.