2010-10-24 4 views
1

Etant donné un type de donnéesComment obtenir des paramètres de type de Sybs dataTypeOf

data Foo = 
    Foo1 { foo1Name :: String} 
    | Foo2 { foo2Name :: String, foo2Age :: Integer } 

Je voudrais être en mesure d'extraire le Data.Data.DataTypeS des champs de Foo1 et Foo2.

J'ai essayé

datatype = (undefined :: Foo) 
constrs = dataTypeConstrs datatype 
foo1 = fromConstrs (head constrs) :: Foo 
foo1Fields = gmapQ dataTypeOf foo1 

mais foo1Fields va juste dire que foo1Name est un Prelude.[] et non le paramètre type est utilisé.

Est-il possible d'extraire des paramètres de type en utilisant SYB ou dois-je utiliser une autre bibliothèque de réflexion?

Répondre

2

Je ne comprends pas exactement ce que vous cherchez à faire ici? DataTypes sont pour construire réellement des choses. Si vous voulez juste obtenir les types, vous devriez utiliser typeOf.

Cela fonctionne, par exemple, mais il donne TypeReps plutôt que DataTypes (qui, je pense, est la bonne chose)

{-# Language DeriveDataTypeable #-} 
import Data.Data 
import Data.Typeable 

data Foo = 
    Foo1 { foo1Name :: String} 
    | Foo2 { foo2Name :: String, foo2Age :: Integer } deriving (Data, Typeable, Show) 

datatype = dataTypeOf (undefined :: Foo) 
constrs = dataTypeConstrs datatype 
fooConstrs = map fromConstr constrs :: [Foo] 
foo1Fields = map (gmapQ typeOf) fooConstrs 
-- foo1Fields = [[[Char]],[[Char],Integer]] 
Questions connexes