懒惰评估实施

时间:2012-11-20 15:21:01

标签: haskell lazy-evaluation

我有一个函数fromRange,它接受​​一个过滤函数和一个区间,并返回一个集合,其中包含满足过滤函数的区间中的所有元素。

我使用列表理解来实现它:

fromRange   :: (Integer->Bool) -> (Integer,Integer)  -> [Integer]
fromRange f (x,y) = [i | i<-[x..y], f i]

但是大列表需要很长时间,所以我找到了懒惰的评估概念,但我不知道如何实现它,任何帮助?

1 个答案:

答案 0 :(得分:6)

对于大型数据集,懒惰评估不应该更快,它只会将评估推迟到需要该值的那一刻。例如,如果您输入ghci

fromRange (< 50) (1, 1000000000)

你必须永远等待,然后才能遍历整个列表来过滤它并打印结果。

另一方面:

take 10 $ fromRange (< 50) (1, 1000000000)

将立即完成,因为它不必计算列表的其余部分。

注意:take 100也会挂起,因为它找不到足够的条目。