Info über die Art Familie Instanzen
-
26-09-2019 - |
Frage
Intro:
Während Check-out snoyman der "persistent" Bibliothek fand ich mich GHCI (oder ein anderes Werkzeug) Unterstützung wollen in herauszufinden Zeug.
GHCI der :info
scheint nicht zu Arbeit als gut mit Typ-Familien und Daten-Familien, da es mit „plain“ Typen tut:
> :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)
Man kann immer für die Instanz Blick in den Quellcode, aber manchmal könnte es schwierig sein, sie zu finden und es kann in der Schablone-haskell generierten Code usw. versteckt werden.
Code-Beispiel:
{-# 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
|]
Was ist auf im Codebeispiel gehen oben ist, dass Template-Haskell-Code für uns erzeugt hier. Alle die Erweiterungen oben mit Ausnahme QuasiQuotes
sind erforderlich, da der generierte Code sie verwendet.
fand ich heraus, was Persist.Key Potato
ist, indem Sie:
-- 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
Frage:
Gibt es einen einfacheren Weg, um Informationen über Fälle von Typ Familien und Daten Familien zu bekommen, mit GHCI oder einem anderen Werkzeug?
Lösung
Does -ddump-splices
zeigen Ihnen den TH-generierten Code in diesem Fall?
Ansonsten :browse
gibt Ihnen Informationen über Daten Familie Instanzen, wenn auch nicht über Art Familien.
Sie möchten vielleicht einen ghc Ticket Datei - die :browse
Ausgabe sieht verstümmelt, und ein könnten Daten Familie Instanzen erwarten wie Klasseninstanzen gemeldet werden, von :info
.