Haskell标准库是否具有给定列表和谓词的函数,并返回满足该谓词的元素数量?类似于(a -> Bool) -> [a] -> Int
类型。我的搜索没有返回任何有趣的信息。目前,我正在使用length . filter pred
,但我认为这不是一个特别优雅的解决方案。我的用例似乎很普通,足以拥有一个更好的库解决方案。是这种情况还是我的预告是错误的?
最佳答案
length . filter p
实现并不像您建议的那样糟糕。特别是,它在内存和速度上只有恒定的开销,是的。
对于使用流融合的事物(例如vector
包),实际上会优化length . filter p
以避免创建中间 vector 。但是,列表目前使用所谓的foldr/build
融合,这种功能不足以优化length . filter p
而又不产生线性大的堆积体,从而有可能导致堆栈溢出的问题。
有关流融合的详细信息,请参见this paper。据我了解,主要在Haskell库中当前不使用流融合的原因是(如本文所述)约有5%的程序在基于流的库之上实现时性能会大大恶化,而foldr/build
优化可以从不(AFAIK)积极降低性能。
关于haskell - 计算满足给定谓词的列表中元素的数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9070570/