3 回答
TA貢獻1804條經驗 獲得超3個贊
Haskell中關于Thunks和Weak Head Normal Form的部分Wikibooks 對懶惰的描述提供了對WHNF的非常好的描述以及這個有用的描述:
逐步評估值(4,[1,2])。第一階段完全沒有評估; 所有后續表格都在WHNF中,最后一個表格也是正常形式。
TA貢獻1836條經驗 獲得超3個贊
Haskell程序是表達式,它們通過執行評估來運行。
要評估表達式,請按其定義替換所有函數應用程序。你這樣做的順序并不重要,但它仍然很重要:從最外面的應用程序開始,從左到右進行; 這稱為懶惰評估。
例:
take 1 (1:2:3:[])=> { apply take }
1 : take (1-1) (2:3:[])=> { apply (-) }
1 : take 0 (2:3:[])=> { apply take }
1 : []當沒有更多功能應用程序需要更換時,評估停止。結果是正常形式(或縮小的正常形式,RNF)。無論您評估表達式的順序如何,您總是會以相同的正常形式結束(但僅在評估終止時)。
懶惰評估的描述略有不同。也就是說,它表示你應該只評估所有的弱頭正常形式。在WHNF中,表達式恰好有三種情況:
構造函數:
constructor expression_1 expression_2 ...一個內置函數,參數太少,比如
(+) 2或sqrtlambda表達式:
\x -> expression
換句話說,表達式的頭部(即最外面的函數應用程序)不能再進一步求值,但函數參數可能包含未評估的表達式。
WHNF的例子:
3 : take 2 [2,3,4] -- outermost function is a constructor (:)(3+1) : [4..] -- ditto\x -> 4+5 -- lambda expression
筆記
WHNF中的“頭”不是指列表的頭部,而是指最外層的函數應用程序。
有時候,人們會將未評價的表達稱為“thunk”,但我認為這不是理解它的好方法。
頭部正規形式(HNF)與Haskell無關。它與WHNF的不同之處在于,lambda表達式的實體也在某種程度上得到了評估。
添加回答
舉報
