部分申请和关闭

2024-01-18

有人问我偏函数应用和闭包之间有什么关系。 我会说没有,除非我没有抓住重点。 假设我正在用 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); }

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


偏函数应用是指修复给定函数的一些参数,以产生另一个参数更少的函数, 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 绑定到常量以产生两个变量的函数时。)所以您可以说,柯里化是一种技术,在实践中作为副产品,可以使许多有用的部分功能应用程序变得微不足道,但这不是柯里化的重点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

部分申请和关闭 的相关文章

  • C# 闭包堆分配发生在方法开始时

    我似乎遇到了 C 编译器的一些奇怪行为 考虑以下代码示例 static void Main string args Foo false 8 public static void Foo bool execute int x if execu
  • 函数中的变量

    我看到了下面的代码 第一次调用 next num 回报1 第二个返回2 define next num let num 0 lambda set num num 1 num next num 1 next num 2 我无法理解的是 num
  • 从 lapply 返回匿名函数 - 出了什么问题?

    当尝试使用创建类似函数的列表时lapply 我发现列表中的所有函数都是相同的 并且等于最终元素应该是什么 考虑以下 pow lt function x y x y pl lt lapply 1 3 function y function x
  • JavaScript 闭包中的内存泄漏风险

    Solved 关于这个主题 网络上有很多相互矛盾的信息 感谢 John 我设法发现闭包 如下所用 并不是内存泄漏的原因 而且 即使在 IE8 中 它们并不像人们声称的那么常见 事实上 我的代码中只发生了 1 处泄漏 事实证明修复起来并不困难
  • 了解 JavaScript 闭包 - 冻结传递给回调的变量

    我对 JavaScript 闭包还没有基本的了解 我有一个关于具体情况的问题 这也许也是基本和常见的例子 3 秒内从 1 数到 3 请参阅此处的 JSFiddle http jsfiddle net nAh8x http jsfiddle
  • JavaScript/jQuery 中括号中的代码块意味着什么? [复制]

    这个问题在这里已经有答案了 可能的重复 function jQuery 是什么意思 意思是 https stackoverflow com questions 2937227 jquery what does function jquery
  • Python 中的嵌套函数如何工作?

    def maker n def action x return x n return action f maker 2 print f print f 3 print f 4 g maker 3 print g 3 print f 3 st
  • 实际上什么时候创建闭包?

    以下情况是否会创建闭包foo 但不适合bar Case 1 foo是一个带有仅具有全局作用域的作用域链的闭包 Case 2 与案例1相同 Case 3
  • Swift loadItem 关闭未运行

    我正在编写一个共享扩展 但捕获并保存共享附件的闭包未运行 我怎样才能找出原因 switch 分支执行 附件就在那里 没有错误消息 它只是永远不会运行 if let contents content attachments as NSItem
  • 这个作用域/闭包什么时候在 javaScript 中被垃圾回收?

    我正在做一门课程 该课程正在讨论范围 闭包并简要提到垃圾收集 课程中提出一个问题 范围保持多久 答案是 直到 不再有任何提及它 是的 所以我们基本上说的是 是的 闭包有点像对隐藏范围对象的引用 所以只要有一些函数仍然有一个闭包 范围 该范围
  • 封装的闭包与类?

    我是 JS 来自 C etc 的新手 我突然想到闭包似乎是比类更简单 更方便的处理封装的方法 这段代码似乎给出了一种处理封装的简单方法 function addProperty o var value o get function retu
  • 如何将这段 javascript 代码重写为 C++11?

    这是我在 Javascript Definitive Guide 中看到的 javascript 闭包代码 我想把它写成C 11 var uniqueID1 function var id 0 return function return
  • 使用 Yew 回调作为 wasm_bindgen 闭包

    这个问题是为 Yew v0 19 编写的 异步外部 JavaScript 函数可以通过以下方式在 Rust 中使用Closures https rustwasm github io wasm bindgen api wasm bindgen
  • swift 中闭包和函数作为参数的区别

    我有将近 4 年的 Objective C 经验 并且是 swift 的新手 我试图从 Objective C 的角度理解 swift 的概念 所以如果我错了 请指导我 在目标 c 中 我们有块 可以稍后异步执行的代码块 这绝对是完全合理的
  • 为什么使用闭包进行赋值而不是直接将值赋给键?

    我当时正在看在 7 10 他添加了一个数据库依赖项并使用闭包来分配值 我的问题是为什么不直接使用直接赋值 我的意思是不这样做 container db capsule 相当于这样做 container db function contain
  • Swift 和 inout 参数中闭包的变量捕获

    我注意到 当 Swift 中的闭包捕获变量时 闭包实际上可以修改该值 这对我来说似乎很疯狂 也是一种获得可怕错误的绝佳方法 特别是当同一个 var 被多个闭包捕获时 var capture Hello captured func g thi
  • 如何从事件处理程序返回indexedDB查询结果?

    我必须从indexedDB返回查询结果 但结果只能在onsuccess事件处理程序 1 function listPeople 4 var open indexedDB open AccordionDatabase 1 5 res 6 7
  • python,对装饰和关闭感到困惑

    我有一些测试代码 def num num def deco func def wrap args kwargs inputed num num return func args kwargs return wrap return deco
  • 如何理解 lambda 中的闭包? [复制]

    这个问题在这里已经有答案了 我想循环制作 5 个按钮 并为每个按钮绑定一个命令来打印索引 在以下解决方案中 它始终打印相同的索引 我的代码是这样的 for i in range 5 make button Tkinter Button fr
  • 在 Swift 中,当使用“[weak self] in”时,当嵌套在另一个闭包中时我是否应该加倍它[重复]

    这个问题在这里已经有答案了 在 Swift 中 当使用 weak self in 当嵌套在另一个闭包中时 我应该将其加倍吗 Example override func viewDidLoad super viewDidLoad makeAP

随机推荐

  • 如何从 Innosetup 脚本修改 exe.config

    我已经开始自学Innosetup脚本了 为此 我创建了一个简单的 C 控制台应用程序 它从配置文件中读取元素并输出到控制台
  • 字段的算术运算

    是否可以查询两个字段相减的结果 例如 有两个字段 开始 结束 我想要带有以下内容的文件end start gt 10 这可以直接完成还是唯一的方法是在加载具有此差异的文档时创建一个新字段 您可以使用脚本过滤器 http www elasti
  • 如何获取 Hibernate 中返回的多种对象类型

    我正在使用 Hibernate JSF Spring3 在查询中 我需要获取作为结果返回的许多对象类型 public ArrayList
  • 无法在 Red hat linux 上安装 rgdal 和 rgeos R 库

    我编译时出错rgdal adn rgoes我们的 redhat linux 机器上的包 我尝试做一些研究 但找不到可能的解决方案 您能帮我解决这个问题吗 因为这对我来说非常重要 ERROR WHILE COMPILING RGDAL in
  • 仅变量应通过函数引用进行赋值

    我使用旧版本的 Codeigniter 框架 使用新版本的 php 我收到此错误 Only variables should be assigned by reference 我想知道这是否是安全的错误修复 改变 this gt base
  • ios 应用内订阅 - Original_transaction_id 何时更改?

    当存在自动续订订阅时 请考虑以下模型情况 用户购买 1 个月的订阅 假设在一月份 取消续订 然后等到三月 gt 1 个月 并再次购买相同的订阅 AppStore 是否返回 在收据验证时 新的original transaction id对于
  • iPhone 中的 Sqlite3 数据库被锁定 - 如何避免?

    我有一个在 Sqlite3 DB 上执行搜索的查询 它除了使用阅读器进行阅读之外什么也不做 对于每个找到的匹配项 它都会调用 UI 回调来更新结果视图 当此搜索运行时 我点击了 UI 中的一个按钮 该按钮将在新线程中执行一些其他操作 最后它
  • 溢出 y 隐藏 溢出 x 可见

    我有一个 div 蓝色框 它绝对定位在父元素 红色框 内的页面上 并且我需要将 Overflow y 设置为隐藏 以便强制截断 Y 轴上的溢出内容 但我希望任何溢出 x 的内容都可见 HTML div div div style width
  • 使用 hibernate 标准选择值对象

    我试图找出是否可以使用 Hibernate Criteria API 执行以下 HQL String hql select new InitialCount substring name 1 1 count id from Person g
  • 使用自定义身份验证提供程序/服务的 ASP.Net Identity

    我目前正在开发一个 ASP Net MVC Web 应用程序 需要用户名和密码身份验证 我开始考虑使用 ASP Net Identity 来实现此目的 但是我有一个非常重要的要求 要求是 Web 应用程序本身不能直接访问任何数据库 所有 D
  • Google 地图:如何移动缩放控件?

    如何通过 API 将 Google 地图缩放控件移动到地图的另一侧 var myOptions zoom 6 zoomControl true zoomControlOptions style google maps ZoomControl
  • Bootstrap 3:100%高度后如何粘贴

    我试图让我的导航栏在设置为 100 高度的介绍后固定到顶部 但我不确定执行此操作的最佳方法是什么 Code CSS html body height 100 min height 100 intro height 100 text alig
  • 如何监控第三方存储库的 GitHub 提交

    初学者在这里 我已为由其他人创建和管理的 GitHub 存储库加注星标 有没有办法监视提交并在每次有人签入主分支时向侦听器发送电子邮件 请注意 我不拥有该存储库 我只是想跟踪我喜欢的存储库上的更改 您可以获得原子饲料 https en wi
  • 如何解决此类问题?

    br br br div style line height 50 span style display block span div
  • Swift:如何查看 Xcode 监视窗口中显示的变量值?

    简单的问题 使用 Swift 时如何查看 Xcode 监视窗口中变量的值 这是一个示例 看看 mdn 如何具有值 2067134273 但无法在监视窗口中查看该值 ObjectiveC NSObject 不会扩展为任何内容 我认为这可能是由
  • Matplotlib 在绘图区域内移动刻度标签

    是否可以在绘图区域内放置刻度标签 我已经尝试过 ax tick params axis y pad 5 left off labelleft on and ax tick params axis y direction in left of
  • 为什么在 ASP.NET MVC 中使用数据库工厂?

    最近我使用了 asp net mvc 我在示例项目中看到正在使用数据库工厂类 您如何向我解释为什么使用它 IDatabaseFactory类 public interface IDatabaseFactory IDisposable EFM
  • Sharepoint 2007:为自定义字段类型创建多行文本自定义属性?

    我正在尝试扩展内置的 Choice 字段类型以包含另一条数据 正确答案 这样 用户将能够直接在 Sharepoint 中创建自己的测试 而不必使用 InfoPath 或其他一些复杂的解决方案 我希望继承现有的 SPFieldChoice 类
  • 如何将手动创建的 WebJobs 发布到 Azure

    我按照本文创建了一个针对 NET Core 的 WebJobs 应用程序 http matt roberts me azure webjobs in net core 2 with di and configuration http mat
  • 部分申请和关闭

    有人问我偏函数应用和闭包之间有什么关系 我会说没有 除非我没有抓住重点 假设我正在用 python 编写 并且有一个非常简单的函数 MySum 定义如下 MySum lambda x y x y 现在 我正在修复一个参数以获得一个具有较小数