正常形式
此示例提供了一個簡要概述 - 有關正常形式和示例的更深入說明,請參閱此問題 。
減少正常形式
表示式的簡化形式(或正則形式,當上下文清楚時)是評估給定表示式中所有可簡化子表示式的結果。由於 Haskell 的非嚴格語義(通常稱為懶惰 ),如果子表示式位於繫結器(即 lambda 抽象 - \x -> ..
)下,則子表示式不可簡化。表示式的正常形式具有如果存在,則它是唯一的屬性。
換句話說,(在指稱語義方面)無關緊要的是減少子表示式。但是,編寫高效能 Haskell 程式的關鍵通常是確保在正確的時間評估正確的表示式,即理解操作語義。
正常形式本身的表達被認為是正常形式。
有些表達方式,例如 let x = 1:x in x
,沒有正常形式,但仍然有效。示例表示式仍然有一個值,如果一個允許無限值,這裡是列表 [1,1, ...]
。其他表示式,如 let y = 1+y in y
,沒有價值,或者它們的值是 undefined
。
頭部正常形態弱
RNF 對應於完全評估表示式 - 同樣,弱頭正常形式(WHNF)對應於評估表示式的頭部。如果 e
是應用程式 Con e1 e2 .. en
並且 Con
是建構函式,則表達 e
的頭部被完全評估; 或抽象的\x -> e1
; 或部分應用 f e1 e2 .. en
,其中部分應用意味著 f
需要超過 n
引數(或等效地,e
的型別是函式型別)。在任何情況下,子表示式 e1..en
可以被評估或未評估表示式為 WHNF - 它們甚至可以是 undefined
。
Haskell 的評估語義可以用 WHNF 來描述 - 評估表示式 e
,首先將其評估為 WHNF,然後遞迴地從左到右評估它的所有子表示式。
原始 seq
函式用於評估 WHNF 的表示式。seq x y
在表意上等於 y
(seq x y
的值恰好是 y
); 此外,當 y
被評估為 WHNF 時,x
被評估為 WHNF。表示式也可以用 bang 模式(由 -XBangPatterns
擴充套件啟用)評估為 WHNF,其語法如下:
f !x y = ...
其中 x
將在評估 f
時被評估為 WHNF,而 y
未被(必然)評估。爆炸模式也可以出現在建構函式中,例如
data X = Con A !B C .. N
在這種情況下,建構函式 Con
在 B
欄位中被認為是嚴格的,這意味著當建構函式應用於足夠的(這裡是兩個)引數時,B
欄位被評估為 WHNF。