gpt4 book ai didi

closures - 部分申请和关闭

转载 作者:行者123 更新时间:2023-12-02 22:08:04 25 4
gpt4 key购买 nike

有人问我偏函数应用和闭包之间有什么关系。我会说没有,除非我没有捕获要点。假设我正在用 python 编写,并且有一个非常简单的函数 MySum 定义如下:

MySum = lambda x, y : x + y;

现在我正在修复一个参数以获得一个具有较小数量的函数,该函数返回的值与使用相同参数调用它时 MySum 将返回的值相同(部分应用):

MyPartialSum = lambda x : MySum(x, 0);

我可以用 C: 做同样的事情

int MySum(int x, int y) { return x + y; }
int MyPartialSum(int x) { return MySum(x, 0); }

所以,愚蠢的问题是:有什么区别?为什么我需要关闭部分应用程序?这些代码是等效的,我不明白闭包和部分应用程序有什么约束。

最佳答案

偏函数应用是指修复给定函数的一些参数,以产生另一个参数更少的函数,例如

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 没有适当的闭包。)

柯里化(Currying)是将 N 个参数的函数转换为返回一元函数的一元函数...例如,我们有一个接受三个参数并返回一个值的函数:

sum = lambda x, y, z: x + y + z

柯里化(Currying)版本是

curriedSum = lambda x: lambda y: lambda z: x + y + z

我敢打赌你不会写那样的Python代码。在我看来,柯里化(Currying)的动机主要是出于理论兴趣。 (仅使用一元函数表达计算的框架:每个函数都是一元!)实际的副产品是,在函数柯里化(Currying)的语言中,一些部分应用程序(当您从左侧“修复”参数时) )就像向柯里化(Currying)函数提供参数一样简单。 (但并非所有部分应用程序都是如此。示例:给定 f(x,y,z) = x+2*y+3*z,当您将 y 绑定(bind)到常量以产生两个变量的函数时。)所以您可以说,柯里化(Currying)是一种技术,在实践中作为副产品,可以使许多有用的部分功能应用程序变得微不足道,但这不是柯里化(Currying)的重点。

关于closures - 部分申请和关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11590847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com