部分函数应用是关于修复给定函数的一些参数以产生另一个具有更少参数的函数,例如
sum = lambda x, y: x + y
inc = lambda x: sum(x, 1)
请注意,“inc”是部分应用的“sum”,没有从上下文中捕获任何内容(正如您提到的闭包)。
但是,这种手写(通常是匿名的)函数有点乏味。可以使用函数工厂,它返回一个内部函数。内部函数可以通过从上下文中捕获一些变量来参数化,比如
# sum = lambda x, y: x + y
def makePartialSumF(n):
def partialSumF(x):
return sum(x, n)
return partialSumF
inc = makePartialSumF(1)
plusTwo = makePartialSumF(2)
这里工厂 makePartialSumF 被调用了两次。每次调用都会产生一个 partialSumF 函数(将不同的值捕获为 n)。使用闭包使得部分应用的实现更加方便。所以可以说部分应用可以通过闭包来实现。当然,闭包可以做很多其他事情!(作为一个侧节点,python 没有适当的闭包。)
柯里化是将 N 个参数的函数转换为返回一元函数的一元函数……例如,我们有一个函数,它接受三个参数并返回一个值:
sum = lambda x, y, z: x + y + z
咖喱版本是
curriedSum = lambda x: lambda y: lambda z: x + y + z
我敢打赌你不会写那样的python代码。IMO Currying的动机主要是理论上的兴趣。(仅使用一元函数表示计算的框架:每个函数都是一元的!)实际的副产品是,在函数被柯里化的语言中,一些部分应用程序(当您从左侧“修复”参数时)与提供参数一样微不足道到咖喱函数。(但并非所有部分应用都是这样。示例:给定 f(x,y,z) = x+2*y+3*z,当您将 y 绑定到一个常量以产生两个变量的函数时。)所以您可以说,Currying 是一种在实践中作为副产品的技术,它可以使许多有用的部分功能应用程序变得微不足道,但这不是 Currying 的重点。