我有这样的数据类型:
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不会说服类型检查器这两种类型是等价的。
答案 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