假设:
take 5 (filter p xs)
说如果filter p xs
会返回1K匹配,那么Haskell只会过滤掉5个匹配并且不会产生大的中间结果吗?
答案 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)