抱歉,如果这超出了旧领域。我意识到这已经[之前讨论过]柯里化和部分应用之间有什么区别?. 我仍然希望对术语进行一些澄清。
是否可以公平地说柯里化启用了部分应用,而部分应用在没有被柯里化的函数上是不可能的?是否公平地说,在像 Haskell 这样自动支持部分应用程序的语言中,所有函数都是隐式柯里化的?
抱歉,如果这超出了旧领域。我意识到这已经[之前讨论过]柯里化和部分应用之间有什么区别?. 我仍然希望对术语进行一些澄清。
是否可以公平地说柯里化启用了部分应用,而部分应用在没有被柯里化的函数上是不可能的?是否公平地说,在像 Haskell 这样自动支持部分应用程序的语言中,所有函数都是隐式柯里化的?
柯里化和部分应用都意味着一种语言支持高阶函数 - 即,将函数作为数据传递 - 因为否则它们将无用,并且使用高阶函数,柯里化和部分应用都可以手动实现.
除了上述之外,它们是不同的想法。
你会说有一个while
循环“启用”for
或foreach
循环吗?从某种意义上说,这是对的,但它告诉你没有关于循环的任何有用信息。
部分应用的意思正是它所说的;你将一个函数应用到它的一些参数上,生成一个只需要剩余参数的专用版本。这可以在有或没有对函数进行柯里化的情况下完成,也许使用包装函数来处理 like 的参数apply_foo_to_baz(baz) = ((bar, quux) => foo(bar, baz, quux));
,如果你能原谅伪代码的话。
柯里化意味着将接受多个参数的函数转换foo1(bar, baz, quux);
为一次应用于单个参数的函数,例如foo2(bar)(baz)(quux);
. 应用foo2
更少的参数在技术上不是部分应用,因为该函数只接受一个参数。知道这foo2
是 的柯里化版本foo1
,我们可以将其foo2(bar)
视为 的部分应用形式foo1
,但一般来说,柯里化函数没有任何东西可以在给定任何特定数量的参数的情况下使它们“部分应用”。
就 Haskell 而言,以通常方式定义的函数实际上是默认柯里化的(这是合适的,因为两者都以同一个人命名)。事实上,在不依赖实现细节的情况下有效地定义 Haskell 中“部分应用程序”的含义实际上有点棘手。