Как получить параметры типа из SYBs dataTypeOf - PullRequest
1 голос
/ 24 октября 2010

Учитывая тип данных

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

Я хотел бы иметь возможность извлечь поля Data.Data.DataTypeS из Foo1 и Foo2 s.

Я пытался

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

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

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

1 Ответ

2 голосов
/ 25 октября 2010

Мне не совсем понятно, что вы собираетесь здесь делать? 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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...