3 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
Haskell中關(guān)于Thunks和Weak Head Normal Form的部分Wikibooks 對(duì)懶惰的描述提供了對(duì)WHNF的非常好的描述以及這個(gè)有用的描述:
逐步評(píng)估值(4,[1,2])。第一階段完全沒有評(píng)估; 所有后續(xù)表格都在WHNF中,最后一個(gè)表格也是正常形式。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
Haskell程序是表達(dá)式,它們通過執(zhí)行評(píng)估來運(yùn)行。
要評(píng)估表達(dá)式,請(qǐng)按其定義替換所有函數(shù)應(yīng)用程序。你這樣做的順序并不重要,但它仍然很重要:從最外面的應(yīng)用程序開始,從左到右進(jìn)行; 這稱為懶惰評(píng)估。
例:
take 1 (1:2:3:[])=> { apply take } 1 : take (1-1) (2:3:[])=> { apply (-) } 1 : take 0 (2:3:[])=> { apply take } 1 : []
當(dāng)沒有更多功能應(yīng)用程序需要更換時(shí),評(píng)估停止。結(jié)果是正常形式(或縮小的正常形式,RNF)。無論您評(píng)估表達(dá)式的順序如何,您總是會(huì)以相同的正常形式結(jié)束(但僅在評(píng)估終止時(shí))。
懶惰評(píng)估的描述略有不同。也就是說,它表示你應(yīng)該只評(píng)估所有的弱頭正常形式。在WHNF中,表達(dá)式恰好有三種情況:
構(gòu)造函數(shù):
constructor expression_1 expression_2 ...
一個(gè)內(nèi)置函數(shù),參數(shù)太少,比如
(+) 2
或sqrt
lambda表達(dá)式:
\x -> expression
換句話說,表達(dá)式的頭部(即最外面的函數(shù)應(yīng)用程序)不能再進(jìn)一步求值,但函數(shù)參數(shù)可能包含未評(píng)估的表達(dá)式。
WHNF的例子:
3 : take 2 [2,3,4] -- outermost function is a constructor (:)(3+1) : [4..] -- ditto\x -> 4+5 -- lambda expression
筆記
WHNF中的“頭”不是指列表的頭部,而是指最外層的函數(shù)應(yīng)用程序。
有時(shí)候,人們會(huì)將未評(píng)價(jià)的表達(dá)稱為“thunk”,但我認(rèn)為這不是理解它的好方法。
頭部正規(guī)形式(HNF)與Haskell無關(guān)。它與WHNF的不同之處在于,lambda表達(dá)式的實(shí)體也在某種程度上得到了評(píng)估。
添加回答
舉報(bào)