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

时间:2017-07-21 19:36:58

标签: haskell generic-programming

我有这样的数据类型:

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 个答案:

答案 0 :(得分:6)

使用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
相关问题