Ech*_*lan 6 haskell generic-programming
我有这样的数据类型:
data MyType = Foo Bool
| Bar
| Baz Bool (Maybe String) Bool
| Quux Int String
Run Code Online (Sandbox Code Playgroud)
我可以使用泛型来编写一个getBools :: MyType -> [Bool]返回输入中所有布尔字段列表的函数吗?
我想出了这种类型的签名:
getAllOfType ::
(Generic inner, Generic outer, HasDatatypeInfo inner, All2 HasDatatypeInfo (Code outer)) =>
Proxy inner -> outer -> [inner]
Run Code Online (Sandbox Code Playgroud)
使用generics-sop,但我不认为这是对的.比较DatatypeInfos不会说服类型检查器这两种类型是等价的.
使用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
Run Code Online (Sandbox Code Playgroud)