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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top