- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人问我偏函数应用和闭包之间有什么关系。我会说没有,除非我没有捕获要点。假设我正在用 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/
我刚刚开始使用 Google Closure 做一些工作,我想将选择字段的创建移动到它自己的模板中,并使用类似以下内容调用该模板: {call templates.utils.select} {p
我有一些代码,简化后看起来像: fn foo() -> Vec { unsafe { unsafe_iterator().map(|n| wrap_element(n)).co
我正在从脚本内部调用Closure Compiler(closurecompiler.jar)。该脚本还生成Closure Compiler需要编译的一些javascript。有没有办法将此JavaS
以下示例代码生成有关高级优化的编译器警告:“JSC_UNSAFE_NAMESPACE:为命名空间 NS 创建的别名不完整”。如果我删除@enum 注释,它不会发出警告。 var NS = {}; /*
看代码: let add_one = |&: x| { 1 + x }; 我知道x是闭包参数,但是闭包中的&:是什么意思? 最佳答案 这是 Rust 的一个文档不足的部分(并且过时,请参阅评论)。我知
PHP manual for anonymous functions (即闭包)指出: Anonymous functions are currently implemented using the
我从脚本内部调用 Closure Compiler (closurecompiler.jar)。该脚本还生成了一些 Closure Compiler 需要编译的 javascript。有没有办法将这个
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
当鼠标在文档正文中移动时,我试图调用一个函数。但是,下面的事件处理程序不起作用。 goog.events.listen(document, 'onmousemove', function(e)
我试过了 java -jar compiler.jar --js jj.js --js_output_file jj.js 输出文件大小为 0。 如果我不想从 .min.js 重命名为 .js,我该怎
Google Closure UI库如何与Google DART一起使用? 最佳答案 Dart没有使用JavaScript库的功能。这是设计使然,因为Dart旨在同时针对Dart VM和转换为JS的D
是否可以使用 Google Closure 编译器在两个文件中定义一个类?例如,如果我自动生成一个类并希望为用户输入的代码保留另一个类: 在 MyClass.AutoGenerated.js 中 go
当我在 http://closure-compiler.appspot.com 处的闭包编译器中测试以下代码时: // ==ClosureCompiler== // @output_file_name
是否可以使用 Google Closure 编译器在两个文件中定义一个类?例如,如果我自动生成一个类并希望为用户输入的代码保留另一个类: 在 MyClass.AutoGenerated.js 中 go
当我运行闭包编译器时,会收到一堆这样的警告: [exec] jquery/3.2.1/dist/jquery.js:733: WARNING - Suspicious code. The resul
假设您正在一个具有多个外部库依赖项的 javascript 项目中工作,并且想要在 ADVANCED_OPTIMIZATIONS 模式下使用 Google Closure Compiler 编译您的源
我正在为 PIXI.js 库准备 externs。我收到以下警告: js/Test.js:188: WARNING - Property position never defined on PIXI.
我最近使用 Google 的 Closure 编译器创建了一个 JavaScript 库:https://github.com/bvaughn/task-runner 我打算让这个库供那些也需要完整闭
我正在尝试自学闭包模板。我做了一个简单的文件 simple.soy: {namespace examples.simple} /** * says hello to the world * @pa
我正在将一个项目从 jQuery 迁移到 Closure。我有一些我想编译的只迁移了一半的代码。未编译的源工作正常。我想知道使用 SIMPLE_OPTIMIZATIONS 编译它的编译命令。 原始基于
我是一名优秀的程序员,十分优秀!