[英]Haskell filter function laziness
鑒於:
take 5 (filter p xs)
如果filter p xs
將返回1K匹配,那么Haskell只過濾掉5個匹配並且不產生大的中間結果嗎?
它只掃描xs
只需要生成5個匹配項,只在xs
前綴上計算p
。
更准確地說,它實際上可以執行更少的計算,具體取決於結果的使用方式。 例如,
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
只要求這五個中的第一個,因此懶惰導致僅僅評估。
在什么情況下“會回歸1K比賽”?
Haskell無法通過首先評估filter p xs
(就像在Java或Ruby等普通的按值調用語言中那樣)。 它的工作原理是首先評估take 5
(在這種情況下)。 take 5
將評估足夠的filter p xs
以得到結果,而不是評估其余的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.