使用谓词进行惰性求值

Mic*_*ens 4 haskell lazy-evaluation

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

hitsThreshold :: Int -> (a -> Bool) -> [a] -> Bool
hitsThreshold threshold test strs =
  (length $ filter test strs) >= threshold
Run Code Online (Sandbox Code Playgroud)

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

jam*_*idh 10

这是你想要的一个例子

length $ take 10 $ filter even [1..]
Run Code Online (Sandbox Code Playgroud)

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

你正在通过过滤器输入[1 ..] even,然后将数字加上10 ....然后你用该列表做一些事情.而不是length,您可以通过使用来检查它是否达到了阈值(>= 10) $ length.