Generics 如何从SYBs dataTypeOf获取类型参数

Generics 如何从SYBs dataTypeOf获取类型参数,generics,reflection,haskell,Generics,Reflection,Haskell,给定一个数据类型 data Foo = Foo1 { foo1Name :: String} | Foo2 { foo2Name :: String, foo2Age :: Integer } 我希望能够提取Foo1和Foo2s字段的Data.Data.DataTypeS 我试过了 datatype = (undefined :: Foo) constrs = dataTypeConstrs datatype foo1 = fromConstrs (head constrs) ::

给定一个数据类型

data Foo =
  Foo1 { foo1Name :: String} 
  | Foo2 { foo2Name :: String, foo2Age :: Integer }
我希望能够提取
Foo1
Foo2
s字段的
Data.Data.DataTypeS

我试过了

datatype = (undefined :: Foo)
constrs = dataTypeConstrs datatype
foo1 = fromConstrs (head constrs) :: Foo
foo1Fields = gmapQ dataTypeOf foo1
但是
foo1Fields
只会说
foo1Name
Prelude.[]
而不是使用哪个类型参数


是否可以使用SYB提取类型参数,还是应该使用另一个反射库?

我不清楚您在这里要做什么?数据类型用于实际构建东西。如果您只想获取类型,那么应该使用typeOf

例如,这是可行的,但它产生的是TypeRep而不是数据类型(我认为这是正确的)

{-# 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]]