代码之家  ›  专栏  ›  技术社区  ›  Echo Nolan Thomas Peters

如何使用泛型提取特定类型的所有值?

  •  6
  • Echo Nolan Thomas Peters  · 技术社区  · 8 年前

    我有这样的数据类型:

    data MyType = Foo Bool
                | Bar
                | Baz Bool (Maybe String) Bool
                | Quux Int String
    

    getBools :: MyType -> [Bool] 返回输入中所有布尔字段的列表?

    我想出了这个类型的签名:

    getAllOfType ::
      (Generic inner, Generic outer, HasDatatypeInfo inner, All2 HasDatatypeInfo (Code outer)) =>
      Proxy inner -> outer -> [inner]
    

    使用 generics-sop ,但我认为这不对。比较 DatatypeInfo s不会让类型检查器相信这两种类型是等价的。

    1 回复  |  直到 8 年前
        1
  •  6
  •   soupi    8 年前

    使用 uniplate :

    {-# LANGUAGE DeriveDataTypeable #-}
    
    module M where
    
    import Data.Data
    import Data.Generics.Uniplate.Data
    
    data MyType
      = Foo Bool
      | Bar
      | Baz Bool (Maybe String) Bool
      | Quux Int String
      deriving Data
    
    getBools :: MyType -> [Bool]
    getBools = universeBi