使用谓词进行惰性求值

时间:2013-12-16 22:07:16

标签: haskell lazy-evaluation

我正在尝试在Haskell中编写一个函数来计算满足谓词的列表中的元素,如果数量超过某个阈值则返回True。我有一个看起来像这样的实现:

hitsThreshold :: Int -> (a -> Bool) -> [a] -> Bool
hitsThreshold threshold test strs =
  (length $ filter test strs) >= threshold

问题是,我希望这个懒惰地评估,以便它在长度达到阈值时立即终止。例如,我应该能够传入无限列表,它应该在有限的时间内终止(假设最终达到阈值)。有一种简单的方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:10)

以下是您想要的示例

length $ take 10 $ filter even [1..]

[1 ..]是无限的,所以如果这不是懒惰,程序就会挂起。

您正在通过过滤器even移植[1 ..],然后将数字加上10 ....然后您对该列表执行某些操作。您可以使用length来检查它是否达到了阈值,而不是(>= 10) $ length