1

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

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

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

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

4

1 回答 1

6

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

fromRange (< 50) (1, 1000000000)

在它遍历整个列表以过滤它并打印结果之前,您必须永远等待。

另一方面:

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

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

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

于 2012-11-20T15:36:37.400 回答