我正在尝试在Haskell中编写一个函数来计算满足谓词的列表中的元素,如果数量超过某个阈值则返回True
。我有一个看起来像这样的实现:
hitsThreshold :: Int -> (a -> Bool) -> [a] -> Bool
hitsThreshold threshold test strs =
(length $ filter test strs) >= threshold
问题是,我希望这个懒惰地评估,以便它在长度达到阈值时立即终止。例如,我应该能够传入无限列表,它应该在有限的时间内终止(假设最终达到阈值)。有一种简单的方法可以做到这一点吗?
答案 0 :(得分:10)
以下是您想要的示例
length $ take 10 $ filter even [1..]
[1 ..]是无限的,所以如果这不是懒惰,程序就会挂起。
您正在通过过滤器even
移植[1 ..],然后将数字加上10 ....然后您对该列表执行某些操作。您可以使用length
来检查它是否达到了阈值,而不是(>= 10) $ length
。