【发布时间】:2014-01-04 11:50:15
【问题描述】:
我正在尝试在 Haskell 中编写一个函数来计算列表中满足谓词的元素,如果数量超过某个阈值,则返回 True。我有一个看起来像这样的实现:
hitsThreshold :: Int -> (a -> Bool) -> [a] -> Bool
hitsThreshold threshold test strs =
(length $ filter test strs) >= threshold
问题是,我希望它延迟评估,以便在长度达到阈值时立即终止。例如,我应该能够传入一个无限列表,并且它应该在有限时间内终止(假设最终达到阈值)。有没有简单的方法可以做到这一点?
【问题讨论】:
-
使用
takeWhile而不是filter。我对 Haskell 的理解仍然太差,无法正确解释,但它应该可以工作。或者实际上只是take,因为它首先获得n元素。 -
看看
length、take和filter是如何定义的,并思考它们在惰性求值下是如何构成的,可能会有所帮助 -
IOW
hitsThreshold threshold test strs = (length $ take threshold $ filter test strs) == threshold.