2014-05-05 88 views
1

什麼時候使用懶惰評估而不是渴望評估更好?當你知道表達式只計算一次,或者從不計算時,它會更好嗎?什麼時候變得更好?

+1

這是很難說的一般,至少在任何有用的方式。這取決於語言和任務。 – Chuck

+0

@Chuck有我在我的答案中鏈接到的這篇着名的文章,這是一個普遍的論點... –

+0

@WillNess:我已閱讀爲什麼函數式編程很重要,只是再次刷新它來刷新我的記憶,我不認爲它包含這個問題的一個很好的答案。它解釋了普遍惰性評估的一些普遍優勢,但AFAIK並沒有探討懶惰與嚴格評估之間的實際權衡,或者如何評估在給定情況下哪種方法更好用(例如,在Haskell中,有一整類通過切換到嚴格評估而消除的問題)。我同意這篇文章的啓發性和相關性,但它並沒有真正回答這裏提出的問題。 – Chuck

回答

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發現的(有序的)列表的並集(有序的,增加的)數字列表,mapmap等....,沒有惰性語義將不得不將maintain all kinds of mechanics explicitly混合在一起,而不是使用這些好的獨立模塊函數與函數組合鏈接在一起。

相關問題