有兩種方法來評估的表達式:
- 懶惰(評價最外側的第一)。
- 嚴格(評估最裏面的第一個)。
考慮下面的函數:
select x y z = if x > z then x else y
現在,讓我們把它叫做:
select (2 + 3) (3 + 4) (1 + 2)
這將如何進行評估?
嚴格評價:評價最裏面的第一個。
select (2 + 3) (3 + 4) (1 + 2)
select 5 (3 + 4) (1 + 2)
select 5 7 (1 + 2)
select 5 7 3
if 5 > 3 then 5 else 7
if True then 5 else 7
5
嚴格的評估花了6個減少。要評估select
我們首先必須評估它的論點。在嚴格評估中,函數的參數總是被充分評估。因此功能是「按價值調用」。因此沒有額外的簿記。
懶惰評價:評價最外面的第一個。
select (2 + 3) (3 + 4) (1 + 2)
if (2 + 3) > (1 + 2) then (2 + 3) else (3 + 4)
if 5 > (1 + 2) then 5 else (3 + 4)
if 5 > 3 then 5 else (3 + 4)
if True then 5 else (3 + 4)
5
懶惰評價只需要5減少。我們從未使用過(3 + 4)
,因此我們從未評估過它。在懶惰評估中,我們可以評估一個函數而不用評估它的參數。參數只在需要時才被評估。因此功能是「按需呼叫」。
然而,「按需呼叫」評估策略需要額外的簿記 - 您需要跟蹤是否評估了表達式。在上述表達式中,當我們評估x = (2 + 3)
時,我們不需要再次評估它。但是,我們確實需要跟蹤它是否得到評估。
Haskell支持嚴格和懶惰的評估。但是它默認支持懶評估。要啓用嚴格的評估,您必須使用特殊功能seq
和deepSeq
。
同樣,您可以在JavaScript等嚴格語言中進行懶惰評估。但是,您需要跟蹤表達式是否已經過評估。你可以研究用JavaScript或類似語言實現thunk。