【问题标题】:Weak head normal form and normal form弱头范式和范式
【发布时间】:2017-06-12 07:54:18
【问题描述】:

我对弱头范式和范式有疑问。

弱头范式意味着,表达式只会在需要到达数据构造函数时进行评估。

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

现在,我有以下表达:

\x -> x * 10

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

"Papu" ++ "chon"

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

【问题讨论】:

  • 您已经回答了自己的问题:1) 因为“表达式 [is] 已完全评估”。 2) 因为“表达式 [is not] 评估 [d] 达到数据构造函数所必需的”。也许您应该说明这些定义您不清楚的地方。

标签: haskell


【解决方案1】:

WHNF 计算的距离足以到达数据构造函数或 lambda 函数

如果您有一个未使用参数调用的 lambda 函数,则无论如何您都无法进一步评估它。因此 lambda 函数在 WHNF 中,实际上在 NF 中,因为没有什么可以进一步评估的。现在,如果您调用带有参数的 lambda 函数,我们可以评估结果可能是什么。但是 lambda 函数本身呢?没有什么可做的了。

您的第一个表达式是一个没有参数的 lambda 函数。因此它是正常形式的。

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

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

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

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

(++) "Papu" "chon"

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

【讨论】:

  • 实际上,lambda 术语的正常形式传统上意味着在 lambda 下尽可能多地进行评估。 \x -> (1 + 1) + x 不是正常形式,因为它可以简化为 \x -> 2 + x
  • WHNF中的数据构造函数是不是lazy的要求?
【解决方案2】:
\x -> x * 10

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

因为,你无法简化它。


"Papu" ++ "chon"

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

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

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

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


如果你想知道WHNF和NF有什么区别,可以阅读,例如this

【讨论】:

  • 关于lambda表达式,simplify是什么意思?
  • 你可以simplify一些表达式,如果它有子表达式lambda application,你可以减少它(应用它)。或者更简单,您可以调用函数并获取结果。在您的示例中,您无法计算 x * 10,因为您不知道 x 值。
  • @chi 和 MathematicalOrchid:你有两个不同的 NF 概念(当 MathematicalOrchid 不是时,chi 很高兴在 lambdas 下减少)。这可能会让读者感到困惑。
  • @zero_coding 是的,你可以。此外,您必须这样做才能转换为 NF。
  • @zero_coding 但在 Haskell 中,WHNF 的约定等同于函数的 NF。 (见instance NFData (a -> b)
猜你喜欢
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 2015-09-03
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2015-04-28
相关资源
最近更新 更多