如何从SYBase数据类型中获取类型参数

时间:2010-10-24 09:24:53

标签: generics reflection haskell

给定数据类型

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

我希望能够提取Data.Data.DataTypeSFoo1Foo2字段。

我试过

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

foo1Fields只会说foo1NamePrelude.[]而不是使用哪个类型参数。

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

1 个答案:

答案 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]]