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