【问题标题】:Lazy evaluation with a predicate带有谓词的惰性求值
【发布时间】: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 元素。
  • 看看lengthtakefilter 是如何定义的,并思考它们在惰性求值下是如何构成的,可能会有所帮助
  • IOWhitsThreshold threshold test strs = (length $ take threshold $ filter test strs) == threshold.

标签: haskell lazy-evaluation


【解决方案1】:

这是您想要的示例

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

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

您正在通过过滤器even 传递 [1..],然后将数字上限设置为 10...。然后您对该列表执行一些操作。代替length,您可以使用(>= 10) $ length 来检查它是否达到阈值。

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    相关资源
    最近更新 更多