抱歉,如果这是旧事。我意识到这已经[之前讨论过]What is the difference between currying and partial application? 。我仍然希望对术语进行一些澄清。
可以公平地说,柯里化(Currying)启用了部分应用程序,并且在尚未柯里化(Currying)的函数上不可能实现部分应用程序吗?公平地说,在像 Haskell 这样自动支持部分应用程序的语言中,所有函数都是隐式柯里化(Currying)的吗?
最佳答案
柯里化(Currying)和部分应用都意味着一种语言支持高阶函数——也就是说,将函数作为数据传递——因为否则它们将毫无用处,并且使用高阶函数,柯里化(Currying)和部分应用都可以手动实现。
除了上述之外,它们是不同的想法。
你会说拥有 while
循环“启用”for
或foreach
循环?从某种意义上来说这是正确的,但它没有告诉您有关循环的任何有用信息。
部分应用正如其所言;您将函数应用于其某些参数,从而生成仅需要其余参数的专用版本。这可以通过或不柯里化(Currying)函数来完成,也许使用包装函数来处理参数,如 apply_foo_to_baz(baz) = ((bar, quux) => foo(bar, baz, quux));
,请原谅我的伪代码。
柯里化(Currying)意味着转换采用多个参数的函数,如 foo1(bar, baz, quux);
一次应用于一个参数,例如 foo2(bar)(baz)(quux);
。正在申请foo2
从技术上讲,减少参数并不是部分应用,因为该函数只接受一个参数。知道foo2
是 foo1
的柯里化(Currying)版本,我们可以想到foo2(bar)
作为 foo1
的部分应用形式,但是一般来说,柯里化(Currying)函数不会使它们在给定任何特定数量的参数的情况下“部分应用”。
就 Haskell 而言,默认情况下,以通常方式定义的函数实际上是柯里化(Currying)的(这是合适的,因为两者都是以 the same person 命名的)。事实上,在不依赖实现细节的情况下有效地定义 Haskell 中“部分应用程序”的含义实际上有点棘手。
关于partial - 可以说柯里化(Currying)是部分应用的实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12920948/