代码之家  ›  专栏  ›  技术社区  ›  finnsson

如何从sybs datatypeof获取类型参数

  •  1
  • finnsson  · 技术社区  · 14 年前

    给定数据类型

    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 回复  |  直到 14 年前
        1
  •  2
  •   sclv    14 年前

    我不清楚你到底想干什么?数据类型用于实际构建事物。如果您只想获得类型,那么应该使用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]]