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

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不会说服类型检查器这两种类型是等价的.

sou*_*upi 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
Run Code Online (Sandbox Code Playgroud)