2010-10-24 3 views
1

Учитывая типКак получить параметры типа от SYBs dataTypeOf

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

данные, которые я хотел бы быть в состоянии извлечь из Data.Data.DataTypeSFoo1 и Foo2 сек полей.

Я попытался

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

но foo1Fields будет просто сказать, что foo1Name является Prelude.[], а не какой параметр типа используется.

Можно ли извлекать параметры типа с помощью SYB или использовать другую библиотеку отражений?

ответ

2

Я не совсем понял, что вы хотите здесь сделать? DataTypes для фактического построения вещей. Если вы просто хотите получить типы, вы должны использовать typeOf.

Это работает, например, но она дает TypeReps, а не Datatypes (которые, я думаю, это правильно)

{-# 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]] 
Смежные вопросы