簡體   English   中英

Haskell過濾函數懶惰

[英]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以得到結果,而不是評估其余的。

是的,它不會。

如果是這樣的話,以下類似的東西將不再起作用

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

此功能稱為延遲評估

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM