惰性求值-Lazy evaluation

惰性方法是指一系列嵌套的方法的求值被延遲到一個求值(方法|表達式)的出現。
用haskell做說明的話

print (drop 2 "abcd")

drop 不是一個求值方法,而print 是一個求值方法,所以其實是print 導致了 (drop 2 “abcd”)被求值。

在上面這種簡單的情況下可能看不出惰性求值的作用,我們看一個比較複雜的例子

sum (takeWhile (<10000) [m | m <- [n^2 | n <- [1..]], odd m])

[1..]代表一個無限長的list,可想而知,如果他先被求值的話,整個程序就會立即崩潰了。
上面的最終求值方法是sum,takeWhile ,方法是先從最外面執行,而裏面的一堆方法,會被看成一個需要被求值的塊,直到真正需要值的時候之前,求值塊不會被求值,所以等到[1..]需要被求值的時候,是用takeWhile (<10000)來對他進行求值,保證他只有10000個元素,而不是一個無限長的list。

惰性求值有很多好處,java8的流類也是惰性求值的,用過的人應該會比較清楚,stream是不會被直接求值的,除非對它使用一個終止方法,例如collect,而在調用求值方法的時候,之前積累的方法可以被優化,例如filter,map可能會被壓縮到一次循環中,而在非惰性求值中,就是兩次循環。

惰性求值一般常出現於函數式語言,或者某些語言的函數式框架中,像java8的stream,rxjava之類的


我的github
https://github.com/luckyCatMiao

發佈了108 篇原創文章 · 獲贊 64 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章