头部正常形态和正常形态

zer*_*ing 0 haskell

我对弱头正常形态和正常形态有疑问.

弱头普通形式意味着,表达式只会在达到数据构造函数时进行评估.

正常形式表示,表达式将被完全评估.

现在,我有以下表达式:

\x -> x * 10
Run Code Online (Sandbox Code Playgroud)

为什么上面的表达式是正常的?

"Papu" ++ "chon"
Run Code Online (Sandbox Code Playgroud)

为什么上面的表达既不是WHNF也不是NF?

Mat*_*hid 6

WHNF评估得足以达到数据构造函数或lambda函数.

如果你有一个没有使用参数调用的lambda函数,那么无论如何都无法对它进行评估.所以lambda函数在WHNF中,实际上是NF,因为没有什么可以进一步评估.现在,如果使用参数调用 lambda函数,我们可以评估结果可能是什么.但是lambda函数本身呢?没有别的事情要做.

你的第一个表达式是一个没有参数的lambda函数.这是正常形式.

你的第二个表达式既不是数据构造函数也不是lambda,因此不是任何正常形式.现在,如果你评估它一步,你就得到了

'P' : ("apu" ++ "chon")
Run Code Online (Sandbox Code Playgroud)

其中(虽然语法看起来并不像它)与数据的构造函数(即开始(:)),因此在WHNF,但不是 NF(因为它仍包含未计算的(++)子表达式).

也许如果我们摆脱中缀语法会更容易:

(++) "Papu" "chon"
Run Code Online (Sandbox Code Playgroud)

VS

(:) 'P' ( (++) "apu" "chon" )
Run Code Online (Sandbox Code Playgroud)