头部正常形态和正常形态

时间:2017-06-12 07:54:18

标签: haskell

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

弱头正常形式表示,表达式只会根据需要进行评估,以达到数据构造函数。

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

现在,我有以下表达式:

\x -> x * 10

为什么上面的表达式处于正常状态?

"Papu" ++ "chon"

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

2 个答案:

答案 0 :(得分:6)

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

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

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

你的第二个表达式既不是数据构造函数也不是lambda,因此不是任何正常形式。现在,如果您评估一步,则获得

'P' : ("apu" ++ "chon")

哪个(尽管语法看起来不像)以数据构造函数(即(:))开头,因此在WHNF中是,但不是 NF(因为它仍然包含未评估的(++)子表达式。)

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

(++) "Papu" "chon"

VS

(:) 'P' ( (++) "apu" "chon" )

答案 1 :(得分:3)

\x -> x * 10
     

为什么上面的表达式处于正常状态?

因为,你无法简化它。

"Papu" ++ "chon"
     

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

首先,如果在NF中有一些表达 - 这意味着它在WHNF中。它是WHNF的限制版本。

所以,我们可以重新构建你的问题。 为什么上面的表达式不在WHNF中?

简单的答案是:我们可以将其简化为"Papuchon"

如果您想知道WHNF和NF之间有什么区别,可以阅读this