2011-01-08 41 views
14

據我所知,急於評價/應用順序在應用之前評價函數的所有參數,另一方面,懶惰評價/正常順序僅在需要。渴望評價/應用順序和懶惰評價/正常順序

那麼,什麼是對條款急於評價應用性秩序之間的差異,並懶惰評估正常秩序

謝謝。

回答

8

懶惰評估至多評估一個術語一次,而正常順序會評估它出現的頻率。例如,如果您有f(x) = x+x,並且您將其稱爲f(g(42)),則g(42)在懶惰評估或應用順序下被調用一次,但在正常順序下調用兩次。

至少當使用計算機程序結構和解釋中找到的應用程序的定義時,至少在使用與您相似的應用程序定義時,渴望評估和應用程序是同義詞。 (Wikipedia定義適用的訂單有點不同,並將其作爲急切評估的特例)。

+1

是的我正在閱讀* SICP *。我遵循維基百科鏈接,在[懶惰評估](http://en.wikipedia.org/wiki/Lazy_evaluation)中發現了這一點:「該表達式永遠不會被評估過一次,稱爲應用順序評估。」這意味着適用順序也可以用作懶惰評估的子類型?我有點困惑。 – 2011-01-08 15:50:02

5

我也在閱讀SICP,我對作者給出的正常順序的定義感到好奇。對於我來說,這看起來與懶惰評價相似,所以我去了解更多關於兩者的更多信息。

我知道這個問題很久以前就被問過了,但我看了一下FAQ,發現沒有提到回答老問題,所以我想我會離開我在這裏找到的,所以其他人可以使用它未來。

這是我發現,我傾向於與那些同意:

我認爲(因爲有其他)懶惰的評價和 NormalOrderEvaluation是兩個不同的東西;所不同的是 提到以上。在懶惰的評估中,對參數的評估是 被推遲到需要時,此時評估參數 並且其結果被保存(記憶)。 函數中參數的進一步用法使用計算值。 C/C++運營商||,& &和? : 都是懶惰評估的例子。 (除非一些新手C/C++ 程序員是足夠愚蠢超載& &或||,在這種情況下 重載版本都嚴格順序進行評估;這就是爲什麼& & 和||運營商不應該被用C重載++ )。

換句話說,每個參數至多評估一次,可能根本不是 。

另一方面,NormalOrderEvaluation每次使用時都會重新評估表達式 。想象C語言,支持語言的CallByName,以及循環控制結構的語義等。 正常順序評估可能需要比應用順序 評估更長的時間,並且可能導致副作用發生一次以上。 (這就是爲什麼,當然,有副作用的語句通常應該 不是在C/C++中進行參數中所給宏)

如果參數是不變的,沒有任何副作用,兩者之間的唯一 區別是表現。的確,在純粹的功能語言中,惰性評估可以被看作是對正常順序評估的優化。出現副作用或表達式 可能在重新評估時返回不同的值,這兩種情況具有不同的行爲;尤其是正常秩序的eval在程序語言不好 聲譽因推理 關於這些項目的不ReferentialTransparency難度

同時還應該注意的是嚴格的,爲了評價(以及懶惰 評估)可以實現通過顯式記錄支持正常順序 評估的語言。相反是不正確的;它要求 傳遞可以被稱爲/消息 的thunk,函數或對象以推遲/重複評估。

而且

懶惰的評價結合正常秩序的評價和分享:

•直到你必須(正常順序)

•切勿評估更多的東西比永遠不會計算什麼一次(分享)

http://c2.com/cgi/wiki?LazyEvaluation

http://cs.anu.edu.au/student/comp3610/lectures/Lazy.pdf