2010-06-10 6 views
4

Intro:Information sur les instances de type familial

Tout en vérifiant snoyman's "persistent" bibliothèque, je me suis retrouvé vouloir l'aide des années ghci (ou un autre outil) en déterminer des choses.

semblent pour ghci :info ne pas travailler 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 chercher l'exemple dans le code source, mais parfois il peut être difficile de trouver et il peut être caché dans le modèle-code généré 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 la Exemple de code ci-dessus est que Template-Haskell génère du code pour nous ici. Toutes les extensions ci-dessus sauf pour QuasiQuotes sont requises car le code généré les utilise.

Je trouve 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:

est-il un moyen plus facile d'obtenir des informations sur les cas de familles familles de type et de données, en utilisant ghci ou tout autre outil?

Répondre

5

Est-ce que -ddump-splices vous montre le code généré par TH dans ce cas?

Sinon, :browse vous fournit des informations sur les instances de famille de données, mais pas sur les familles de types.

Vous pouvez déposer une ghc ticket - la sortie :browse semble mutilée, et on pourrait attendre des cas de la famille de données à signaler comme des instances de classe, par :info.

+0

@claus: 10x. ': browse' est génial! '-ddump-splices' montre le code généré par TH. Il s'avère également qu'il est plus agréable que 'pprint' (' 'boo''' vs '[' b ', \ n'o', \ n'o '\ n] 'etc.), pensait' runQ/pprint' La sortie n'est pas seulement déversée, donc je pourrais la filtrer, etc. – yairchu

Questions connexes