给定数据类型
data Foo =
Foo1 { foo1Name :: String}
| Foo2 { foo2Name :: String, foo2Age :: Integer }
我希望能够提取Data.Data.DataTypeS
个Foo1
和Foo2
字段。
我试过
datatype = (undefined :: Foo)
constrs = dataTypeConstrs datatype
foo1 = fromConstrs (head constrs) :: Foo
foo1Fields = gmapQ dataTypeOf foo1
但foo1Fields
只会说foo1Name
是Prelude.[]
而不是使用哪个类型参数。
是否可以使用SYB提取类型参数,还是应该使用其他反射库?
答案 0 :(得分: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]]