我有一个函数fromRange
,它接受一个过滤函数和一个区间,并返回一个集合,其中包含满足过滤函数的区间中的所有元素。
我使用列表理解来实现它:
fromRange :: (Integer->Bool) -> (Integer,Integer) -> [Integer]
fromRange f (x,y) = [i | i<-[x..y], f i]
但是大列表需要很长时间,所以我找到了懒惰的评估概念,但我不知道如何实现它,任何帮助?
答案 0 :(得分:6)
对于大型数据集,懒惰评估不应该更快,它只会将评估推迟到需要该值的那一刻。例如,如果您输入ghci
:
fromRange (< 50) (1, 1000000000)
你必须永远等待,然后才能遍历整个列表来过滤它并打印结果。
另一方面:
take 10 $ fromRange (< 50) (1, 1000000000)
将立即完成,因为它不必计算列表的其余部分。
注意:take 100
也会挂起,因为它找不到足够的条目。