标准库的Haskell类型类MonadPlus,Alternative以及Monoid各自提供两种方法具有基本相同的语义: 空值:mzero,empty或mempty。 操作a -> a -> a:在该类型类联接值加在一起mplus,<|>或mappend。 这三个规则均指定了实例应遵循的以下法律: mempty `mappend` x = x x `mappend` mempty = x 因此,似乎三个类型类都提供相同的方法。 (Alternative也提供some和many,但是它们的默认定义通常就足够了,因此,在这个问题上它们并不是太重要。) 所以,我的查询是:为什么这三个类非常相似?除了它们不同的超类约束之外,它们之间是否还有真正的区别?
假设我有一个包含大量项目的列表。 l = [ 1, 4, 6, 30, 2, ... ] 我想从该列表中获取项目数,其中一个项目应满足一定条件。我的第一个想法是: count = len([i for i in l if my_condition(l)]) 但是,如果my_condition()过滤列表中也包含大量项目,我认为为过滤结果创建新列表只是浪费内存。为了提高效率,恕我直言,上面的通话不能比以下更好: count = 0 for i in l: if my_condition(l): count += 1 是否有任何功能样式的方法来获得满足特定条件的项目数而不生成临时列表? 提前致谢。