偏函数应用是指修复给定函数的一些参数,以产生另一个参数更少的函数, like
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没有proper关闭。)
柯里化是将 N 个参数的函数转换为返回一元函数的一元函数...例如,我们有一个函数,它接受三个参数并返回一个值:
sum = lambda x, y, z: x + y + z
柯里化版本是
curriedSum = lambda x: lambda y: lambda z: x + y + z
我敢打赌你不会写这样的 python 代码。国际海事组织的动机Currying主要是理论上的兴趣。 (仅使用一元函数表达计算的框架:every函数是一元的!)实际的副产品是,在函数被柯里化的语言中,一些部分应用(当你从左边“修复”参数时)就像向柯里化函数提供参数一样微不足道。 (但并非所有部分应用程序都是如此。示例:给定 f(x,y,z) = x+2*y+3*z,当您将 y 绑定到常量以产生两个变量的函数时。)所以您可以说,柯里化是一种技术,在实践中作为副产品,可以使许多有用的部分功能应用程序变得微不足道,但这不是柯里化的重点。