什麼時候使用懶惰評估而不是渴望評估更好?當你知道表達式只計算一次,或者從不計算時,它會更好嗎?什麼時候變得更好?
1
A
回答
2
如果您有選擇,請對錶達式使用懶惰評估,這些表達式可能根本無法評估,或者在評估時可能會在某些情況下導致編程錯誤。
經典的例子是在大多數語言由C降實現,被稱爲「短路運營商」:
if (i != 0 && n/i > 100) ...
這裏,當i
不爲0,這是很好n/i > 100
纔會被計算,因爲它避免零分割錯誤。
+2
更基本的例子是,如果作爲一個特殊的聲明,你不需要,但如果你通過「then」和「else」參數的thunk,你可以將它作爲一個標準函數來實現。那麼當然你需要一些原始的來選擇哪一個被評估,這可以被解決,例如,通過布爾多態性(這是例如SmallTalk的情況) –
1
Why Functional Programming Matters是支持懶惰評估的典型論據,主要作爲改進模塊化的促進者。
我可以通過埃拉託塞尼的篩您提供作爲一個例子爲素數懶惰製劑,
primes = (cons 2 . diff [3..] . bigU . map (\p-> [p*p, p*p+p..])) primes
(.
)是函數的組合物,diff
是一組差異,bigU
發現的(有序的)列表的並集(有序的,增加的)數字列表,map
是map
等....,沒有惰性語義將不得不將maintain all kinds of mechanics explicitly混合在一起,而不是使用這些好的獨立模塊函數與函數組合鏈接在一起。
相關問題
- 1. 什麼時候不使用RelativeLayout更好?
- 2. 什麼時候變得關係
- 3. 什麼時候使用靜態變量更好?
- 4. 什麼時候更新DateTime.Now?
- 5. 什麼時候更精細的鎖定更好的性能?
- 6. 重構在什麼時候變得不值得?
- 7. 什麼時候最好做NSManagedObjectContext保存?
- 8. 什麼時候比數組好?
- 9. MS SQL Server - 什麼時候CURSOR好?
- 10. 什麼時候分類不好/危險?
- 11. 什麼時候是Malloc的好主意?
- 12. 什麼時候最好用C++模板?
- 13. 變量變量:什麼時候有用?
- 14. 變量在什麼時候變化?
- 15. 什麼時候最好加密一個變量?
- 16. 什麼時候在函數中創建局部變量已經更好?
- 17. 什麼時候更新和edittext更新?
- 18. 什麼時候使用ATFolder vs BaseFolder更好?
- 19. 什麼時候更好地完成Seekbar onProgressChanged vs onStopTrackingTouch保存?
- 20. 什麼時候使用C++ iostreams比ReadFile,WriteFile,fprintf等更好?
- 21. 阿卡什麼時候會帶來更好的表現?
- 22. 什麼時候AVL樹比散列表更好?
- 23. 什麼時候在字符串之前使用@會更好?
- 24. 什麼時候使用輪詢而不是通道API更好?
- 25. 什麼時候在Hibernate中更好的標準?
- 26. 什麼時候使用zip代替izip更好?
- 27. 什麼時候do-while循環比while循環更好?
- 28. 什麼時候哈希表比搜索樹更好用?
- 29. 什麼時候jQuery.active值得到重置?
- 30. 什麼時候QLC效率低得多?
這是很難說的一般,至少在任何有用的方式。這取決於語言和任務。 – Chuck
@Chuck有我在我的答案中鏈接到的這篇着名的文章,這是一個普遍的論點... –
@WillNess:我已閱讀爲什麼函數式編程很重要,只是再次刷新它來刷新我的記憶,我不認爲它包含這個問題的一個很好的答案。它解釋了普遍惰性評估的一些普遍優勢,但AFAIK並沒有探討懶惰與嚴格評估之間的實際權衡,或者如何評估在給定情況下哪種方法更好用(例如,在Haskell中,有一整類通過切換到嚴格評估而消除的問題)。我同意這篇文章的啓發性和相關性,但它並沒有真正回答這裏提出的問題。 – Chuck