正常形式
此示例提供了一个简要概述 - 有关正常形式和示例的更深入说明,请参阅此问题 。
减少正常形式
表达式的简化形式(或正则形式,当上下文清楚时)是评估给定表达式中所有可简化子表达式的结果。由于 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。