对不起,如果这已经过时了。我意识到这已经[在What is the difference between currying and partial application?之前讨论过了。我还是想对术语做一些澄清。
是否公平地说,使用启用部分应用程序并且部分应用程序无法在未被咖喱的功能上使用?是否公平地说,在像Haskell这样的语言中,自动支持部分应用程序,所有函数都是隐式计算的?
答案 0 :(得分:2)
currying和部分应用都暗示语言支持高阶函数 - 也就是说,将函数作为数据传递 - 因为它们没有用处,并且使用高阶函数,currying和部分应用都可以手动实施。
除此之外,它们是独立的想法。
你会说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
的部分应用形式,但一般来说,关于curried函数没有任何内容根据任何特定数量的参数,使它们“部分应用”。
就Haskell而言,默认情况下以通常方式定义的函数实际上是 curried (这是合适的,因为两者都以the same person命名)。事实上,在不依赖实现细节的情况下,有效地定义Haskell中“部分应用程序”的含义实际上有点棘手。