Information sur les instances de type familial
-
26-09-2019 - |
Question
Intro:
« persistante » bibliothèque de snoyman je me suis retrouvé vouloir l'aide de ghci (ou un autre outil) à déterminer des choses.
Le :info
de ghci ne semble pas fonctionner comme bien avec le type-familles et les données familles comme il le fait avec les types « 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)
On peut toujours regarder de l'instance dans le code source, mais parfois il peut être difficile de trouver et il peut être caché dans le code généré modèle-haskell etc.
Exemple de code:
{-# 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
|]
Qu'est-ce qui se passe dans l'exemple de code ci-dessus est que Template-Haskell génère un code pour nous ici. Toutes les extensions ci-dessus, sauf pour QuasiQuotes
sont nécessaires parce que le code généré les utilise.
J'ai trouvé ce que Persist.Key Potato
est en faisant:
-- 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
Question:
Y at-il un moyen plus facile d'obtenir des informations sur les cas de familles de type et les familles de données, en utilisant ghci ou tout autre outil?
La solution
Est-ce que -ddump-splices
vous montrer le code généré TH dans ce cas?
Dans le cas contraire, :browse
ne vous donne les informations sur les instances de la famille de données, mais pas sur les familles de type.
Vous pouvez déposer un billet GHC - les regards de sortie :browse
mutilées, et un pourrait attendre des instances de la famille de données à signaler comme des instances de classe, par :info
.