正常形式

此示例提供了一个简要概述 - 有关正常形式和示例的更深入说明,请参阅此问题

减少正常形式

表达式的简化形式(或正则形式,当上下文清楚时)是评估给定表达式中所有可简化子表达式的结果。由于 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。