Haskell过滤函数懒惰

时间:2014-04-24 08:39:48

标签: haskell

假设:

take 5 (filter p xs)

说如果filter p xs会返回1K匹配,那么Haskell只会过滤掉5个匹配并且不会产生大的中间结果吗?

3 个答案:

答案 0 :(得分:4)

它只会根据需要扫描xs以产生5场比赛,仅对此p前缀评估xs

更准确地说,它实际上可以执行更少的计算,具体取决于结果的使用方式。例如,

main = do
   let p x = (x==3) || (x>=1000000)
       list1 = [0..1000000000]
       list2 = take 5 (filter p list1)
   print (head list2)

只会在找到list1之前扫描3,不会再扫描take,尽管head要求提供五个要素。这是因为{{1}}只要求这五个中的第一个,所以懒惰导致仅仅评估它。

答案 1 :(得分:3)

“会在什么情况下返回1K匹配?”

Haskell无法通过首先评估filter p xs(就像在Java或Ruby等普通的按值调用语言中那样)。它首先评估take 5(在这种情况下)。 take 5将对filter p xs进行足够的评估以得出结果,而不会评估其余结果。

答案 2 :(得分:2)

是的,它不会。

如果确实如此,以下内容将不再起作用

take 5 (filter (> 10) [1..])

此功能称为Lazy evaluation