为什么内置函数应用于被认为是弱头正常形式的太少参数?

Rob*_*mba 14 haskell lambda-calculus partial-application reduction weak-head-normal-form

Haskell 定义说:

表达式是弱头正常形式(WHNF),如果它是:

  • 一个构造函数(最终应用于参数),如True,Just(square 42)或(:) 1
  • 一个内置函数应用于太少的参数(可能没有),如(+)2或sqrt.
  • 或lambda抽象\ x - >表达式.

为什么内置功能会得到特殊处理?根据lambda演算,部分应用函数和任何其他函数之间没有区别,因为最后我们只有一个参数函数.

Ben*_*Ben 22

应用于参数的常规函数​​,如下所示:

(\x y -> x + 1 : y) 1
Run Code Online (Sandbox Code Playgroud)

可以减少,给予:

\y -> 1 + 1 : y
Run Code Online (Sandbox Code Playgroud)

在第一个表达式中,"最外层"的东西是一个应用程序,所以它不在WHNF中.在第二个中,最外层的东西是lambda抽象,所以它在WHNF中(即使我们可以在函数体内做更多的缩减).

现在让我们考虑一下内置(原始)函数的应用:

(+) 1
Run Code Online (Sandbox Code Playgroud)

因为这是一个内置函数,所以没有函数体可以替代1第一个参数.评估员"只知道"如何评估完全"饱和"的应用程序(+),例如(+) 1 2.但部分应用的内置功能无法实现; 我们所能做的是产生描述"应用(+)为1,等待一个多参数"的数据结构,而这正是我们试图减少的东西.所以我们什么都不做.

内置函数是特殊的,因为它们不是由lambda演算表达式定义的,因此缩减过程不能"看到"它们的定义.因此,与普通函数应用程序不同,内置函数应用程序必须通过累积参数来"减少",直到它们完全"饱和"(在这种情况下,通过运行内置的任何神奇实现来减少WHNF) .不饱和的内置应用程序无法进一步减少,因此已经在WHNF中.