有没有一种类型类可以抽象出filter
函数?
我在思考这样一个问题:
class Filterable t where
filter :: (a -> Bool) -> t a -> t a
如果不是这种情况,是否有明确的原因呢?
是的,witherable包提供Filterable
,还附带了一些常见类型的实例。
Set
,它并不是一个函子,因此无法起作用。 - marcoshControl.Monad
中有一个 mfilter
方法(链接)。
mfilter :: MonadPlus m => (a -> Bool) -> m a -> m a
t
是否真的需要成为Monad来支持过滤操作呢?在我看来,过滤操作应该与Monad无关。 - marcoshfoldMap (\x -> [x | p x])
或者适用于你的t
类型的等价物-- 无论是原样使用,带有Foldable(加上一个“注入器”,例如 pure
... ;)),还是具有MonadComprehensions(获得 (Monoid (m b), Foldable t, MonadPlus m) => (b -> Bool) -> t b -> m b
)。 - Will NessFunctor
或Foldable
上进行filter
- 我想象不出如何过滤任何类型的树(例如当根值未通过谓词测试时,在每个分支上全部通过测试该如何处理?)。但我和你一样惊讶于这需要一个完整的MonadPlus
。而且我也并不清楚filter
操作通常应遵循哪些规则才配得上这个名字。 - Robin ZigmondMonad
或 Alternative
或任何其他类型类,开发具有自己规则的 Filterable
类型类。甚至可以拥有逆变的 Filterable
类型构造器。Filterable
函子最简洁的定义是方法 deflate :: f (Maybe a) -> f a
,它必须满足适当的身份和组合法则。 - winitzki
[]
)需要定义一个实例。 - chepner[]
、Set
、Seq
、Map k
、IntMap
以及所有建立在它们之上的新类型创建一个Filterable
实例是有意义的。 - marcosh