正常形式

此示例提供了一個簡要概述 - 有關正常形式和示例的更深入說明,請參閱此問題

減少正常形式

表示式的簡化形式(或正則形式,當上下文清楚時)是評估給定表示式中所有可簡化子表示式的結果。由於 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 在表意上等於 yseq x y 的值恰好是 y); 此外,當 y 被評估為 WHNF 時,x 被評估為 WHNF。表示式也可以用 bang 模式(由 -XBangPatterns 擴充套件啟用)評估為 WHNF,其語法如下:

f !x y = ... 

其中 x 將在評估 f 時被評估為 WHNF,而 y 未被(必然)評估。爆炸模式也可以出現在建構函式中,例如

data X = Con A !B C .. N

在這種情況下,建構函式 ConB 欄位中被認為是嚴格的,這意味著當建構函式應用於足夠的(這裡是兩個)引數時,B 欄位被評估為 WHNF。