“关闭”某物是什么意思?

2024-04-07

我试图理解闭包,但从字面上看every我能找到的闭包定义使用了相同的神秘而模糊的短语:“结束".

什么是closure? "哦,这是一个函数结束另一个功能。"

但我找不到“结束”的定义。有人能解释一下 A 事物“关闭”B 事物意味着什么吗?


闭包是由代码指针和环境指针组成的一对。环境指针包含给定函数的所有自由变量。例如:

fun f(a, b) = 
  let fun g(c, d) = a + b + c + d
  in g end

val g = f(1, 2)
val result = g(3, 4)  (*should be 10*)

功能g包含两个自由变量:a and b。如果您不熟悉术语自由变量,它是未在函数范围内定义的变量。在此背景下,为了关闭某物,意味着从函数中删除任何出现的自由变量。上面的例子为闭包提供了很好的动机。当函数f返回,我们需要能够记住的值是什么a and b留待以后。编译的方式是处理函数g作为代码指针和包含所有自由变量的记录,例如:

 fun g(c, d, env) = env.a + env.b + c + d
 fun f(a, b, env) = (g, {a = a, b = b})
 val (g, gEnv) = f(1, 2)
 val result = g(3, 4, gEnv)

当我们应用该函数时g,我们提供调用函数时返回的环境f。请注意,现在功能g不再出现任何未在其范围内定义的变量。我们通常将没有任何自由变量的术语称为closed。如果您仍然不清楚,Matt Might 对闭包转换有一个非常深入的解释:http://matt.might.net/articles/closure-conversion/ http://matt.might.net/articles/closure-conversion/

Javascript 中的相同示例

关闭转换前

function f(a, b){
    function g(c, d) {
        return a + b + c + d
    }
    return g
}

var g = f(1, 2)
var result = g(3, 4)

闭包转换后:

function g(c, d, env) {
    return env.a + env.b + c + d
}

function f(a, b, env) {
    return [g, {"a": a, "b": b}]
}

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

“关闭”某物是什么意思? 的相关文章

  • 将属性类型作为参数传递

    有没有办法将属性作为参数传递给函数 class Car let doors Int 4 let price Int 1000 有没有办法将 Car 属性作为类型传递给函数 我想实现以下目标 func f1 car Car property
  • 如何在 O(n) 时间内遍历二叉树而不需要额外的内存

    给定一棵带有整数 左指针和右指针的二叉树 如何在 O n 时间和 O 1 额外内存 无堆栈 队列 递归 内遍历该树 This guy http nandacumar blogspot com 2006 06 traversing tree
  • 比较周期性数据的快速方法

    假设我有任意类型的数据集 A B C D 并且我想将其与另一个数据集进行比较 我希望 A B C D B C D A C D A B 和 D A B C 的比较成立 但是不适用于 A C B D 或任何其他未类似排序的集合 有什么快速方法可
  • `ImmutableSortedSet` 和 fsharp `Set` 有什么区别?

    BCL引入了一组Immutable Collections http blogs msdn com b bclteam archive 2012 12 18 preview of immutable collections released
  • 为什么 .Net 词典中的条目是按加法顺序排列的?

    我刚刚看到这种行为 我对此感到有点惊讶 如果我向字典中添加 3 或 4 个元素 然后执行 For Each 来获取所有键 它们将以我添加的顺序出现 这让我感到惊讶的原因是字典内部应该是一个哈希表 所以我希望事情能以任何顺序出现 按键的哈希排
  • 根据多个值过滤字典列表

    我有一个字典列表 我想根据多个条件进行过滤 该列表的简化版本如下所示 orders name v price 123 location Mars name x price 223 location Mars name x price 124
  • 初始化 HashMap 的最佳方法

    我通常会这样做 HashMap
  • 如何从数组表示构建不完全二叉树

    如果输入是一个数组 其中null表示没有节点 input 1 2 3 null 5 null 7 请假设我已经检查过输入 对于每个array i 它的父母array i 2 不会是null 递归地 所以根不能是null 如何构建具有这样的逻
  • 为什么在排序输入上插入到树中比随机输入更快?

    现在我一直听说从随机选择的数据构建二叉搜索树比有序数据更快 这仅仅是因为有序数据需要显式重新平衡以将树高度保持在最低限度 最近我实现了一个不可变的treap http en wikipedia org wiki Treap 一种特殊的二叉搜
  • 从 python 中的缩进文本文件创建树/深度嵌套字典

    基本上 我想迭代一个文件并将每行的内容放入一个深层嵌套的字典中 其结构由每行开头的空格数量定义 本质上 目标是采取这样的事情 a b c d e 并将其变成这样的东西 a b c d e Or this apple colours red
  • 在 Python 中进行模糊键查找的最佳方法?

    我遇到一个问题 我需要在哈希映射中进行模糊查找 即返回与最接近查询的键相对应的值 在我的例子中是通过 Levenshtein 距离测量的 我目前的方法是子类化dict使用特殊的查找方法计算所有键的编辑距离 然后返回得分最低的键的值 基本上是
  • Java 拥有闭包后 Scala 的优势 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着 Java 中添加了闭包 作为语言选择 Scala 相对于 Java 的优势是什么 有人可以详细说明一下有什么优点吗 除了闭包 J
  • 不明白 Swift 中的闭包示例

    我正在尝试了解 swift 和闭包 我被这个例子困住了 numbers map number Int gt Int in let result 3 number return result 什么是 number Int gt Int 它是一
  • 匿名函数声明简写 javascript

    我想知道是否有任何方法可以通过使用像 Google Closure 这样的预处理器 编译器来缩短 JavaScript 中的匿名函数声明 我认为这对于回调来说会非常整洁 例如 通常我会这样编写 qunit 测试用例 test Dummy t
  • 变量在嵌套 lambda 中生存时间不够长的借用检查错误

    我在嵌套 lambda 中遇到错误 let rows vec vec 3 6 2 8 9 0 vec 0 0 1 4 5 1 let pair sums rows iter flat map row 0 row len map i row
  • 应用对数来导航树

    我曾经知道一种使用对数从树的一片叶子移动到树的下一个 有序 叶子的方法 我认为它涉及获取 当前 叶子的位置值 排名 并将其用作从根向下到新目标叶子的新遍历的种子 一直使用对数函数测试来确定是否沿着右或左节点向下到达叶子 我已经不记得如何运用
  • 迭代和遍历有什么区别?

    过去几周我一直在学习迭代器 我仍然不明白迭代链接列表和遍历链接列表之间的主要区别 我知道遍历意味着遍历 访问每个元素 链接列表 并且在迭代时基本上做同样的事情 但是有什么不同 为什么不能遍历所有内容 标准库数据结构 遍历 只是意味着遍历数据
  • Linq Where 本地计数器关闭在 VS watch 中的结果不同

    我尝试删除前 3 个元素array与 LinQWhere扩展功能 这是一个例子 var array new 1 2 3 4 5 6 7 8 9 var count 3 var deletedTest1 0 var test1 array W
  • 如何构建一棵与或树?

    我需要一个支持 与 和 或 的树结构 例如 给定一个正则表达式 如ab c d e 我想把它变成一棵树 所以 一开始我们有两个 或 分支 它可以向下ab or c d e 如果你低头ab分支 你得到两个节点 a and b or a其次是b
  • O(n^2) 与 O (n(logn)^2)

    时间复杂度是O n 2 or O n logn 2 better 我知道当我们简化它时 它就变成了 O n vs O logn 2 and logn lt n 但是关于logn 2 n is only less than log n 2 f

随机推荐

  • Three.js 支持波斯语/阿拉伯语文本

    我需要以波斯语 阿拉伯语显示一些文本 我加载了包含字符的字体 并使用 TextGeometry 在场景上创建文本 var loader new THREE FontLoader loader load B Zar Regular js fu
  • 反汇编 Microsoft Visual Studio 2003 编译器输出

    我发现 Microsoft Visual Studio 2003 工具输出的对象文件出现了奇怪的行为 这file实用程序告诉我 asmfile obj 80386 COFF executable not stripped version 3
  • 从 java 执行 PostgreSQL 匿名块

    你好 我有 PostgreSQL 一个匿名块 例如 DATA 是 java 中的一个字符串变量 其中我的匿名块 DO DECLARE new issue text BEGIN new issue UPDATE FORM9902 SET HA
  • 使用 javascript 使复选框表现得像单选按钮

    我需要使用 javascript 操作复选框的行为 它们基本上应该像单选按钮一样 一次只能选择一个 并且取消选择任何先前的选择 问题是我首先不能使用普通的单选按钮 因为每个单选按钮的名称属性都会不同 I know它不是使苹果看起来像梨的最终
  • 项目结算经理与结算帐户用户 GCP

    计费帐户用户或项目计费经理可以创建计费帐户吗 据我了解 用户可以将项目链接到计费帐户 但无法取消链接 而经理可以将项目链接到计费帐户或从计费帐户取消链接 计费帐户用户或项目计费经理可以创建计费帐户吗 不完全是 让我向您介绍一下 Google
  • 如何在输入中添加 SVG 图标?

    我需要在输入中放置图标以创建新用户 对于了解前端代码的人来说 这可能是一项非常简单的任务 但我不这么认为 这是线框 然后我展示我的代码 线框 如你看到的 输入的左侧有图标 现在我的目录中有 SVG 并准备好了 我只需要知道如何将它们放置在输
  • PHP:从递归函数返回一个数组

    我有一个像这样的数组 SimpleXMLElement Object BrowseNodes gt SimpleXMLElement Object BrowseNode gt SimpleXMLElement Object BrowseNo
  • 使用fread读取带有双引号和不正确转义字符的数据

    我尝试使用以下命令加载大型数据文件 约 2000 万行 fread 来自数据表包裹 然而 有些行却造成了很大的麻烦 最小的例子 text csv contains id text 1 Oops The Georgia fread text
  • jQuery UI 仅在特殊区域删除元素

    我对 jQuery UI 的拖放有疑问 我创建动态的新元素 并将其放置在屏幕上的四个区域之一 这些元素是可拖动的 我可以将它们放置在整个屏幕上 但我希望这些元素只能放置在三个区域之一 我在这里创建了一个完整的工作示例 http jsbin
  • 如何在 Java 中格式化数字?

    如何在 Java 中格式化数字 什么是 最佳实践 在格式化之前我需要对数字进行四舍五入吗 32 302342342342343 gt 32 30 7323 gt 0 73 etc From 这个线程 http bytes com forum
  • RHEL w/Tkinter & Python3 - 更改活动名称“Tk”

    我正在尝试为 Tkinter 应用程序设置 Activity 不确定正确的术语 请参阅屏幕截图 名称 我不是 Linux 专家 新手 甚至不是初学者 但是关于对话框的系统将我的测试机器列为 Fedora 30 窗口管理器是 Gnome 代码
  • C#中如何检查组合框中的项目是否被选中?

    我有一个组合框 必须在其中显示数据库中的日期 用户必须从组合框中选择一个日期才能进一步进行 但我不知道如何让用户意识到首先从组合框中选择该项目才能进一步进行 如果用户没有从组合中选择日期 应该遵循什么流程才能收到消息 if string I
  • WPF ToggleButton 不正确的呈现行为

    这是怎么回事 如何解决 按我的切换按钮 现在看起来就像立即按下 选中 同时 MyToggleButton Checked 处理程序禁用 MyToggleButton 现在按非切换按钮 启用 我们看到什么 MyToggleButton 看起来
  • 对于具有默认分配器的标准容器,std::container::size_type 是否保证为 size_t?

    Like std string
  • TFS2018 是否仍支持 ISubscriber?

    截至 TFS 2017 Plugins 文件夹中有一个名为 Microsoft TeamFoundation Framework Server 的库 它包含 ISubscriber 接口 可以覆盖该接口以附加挂钩并添加事件行为 例如构建完成
  • Laravel 用户登录时如何设置会话变量

    发票应用程序开发正在使用 Laravel 进行 我为每个用户存储日期和金额格式settings table 当用户登录自己的帐户时如何设置Session多变的 请提出任何建议 我正在使用 Laravel 5 3 当然 文档告诉我们如何存储会
  • 未使用参数 ngrams

    我使用 Quanteda 进行文本分析 我使用这个命令 corp df2 lt tokens df text remove punct TRUE remove numbers TRUE remove symbols TRUE gt toke
  • XCode 4.4 iOS 5.1 模拟器问题

    我将我的 mac book 更新为 mountain lion 并将 Xcode 更新为 4 4 版本 在之前的版本中 我关闭 iOS 模拟器没有任何问题 并且 Xcode 自动停止构建过程 但现在如果我关闭 iOS 模拟器 Xcode 中
  • Scala:SeqT monad 转换器?

    如果我们有这样的两个函数 def findUserById id Long Future Option User def findAddressByUser user User Future Option Address 然后我们就可以使用
  • “关闭”某物是什么意思?

    我试图理解闭包 但从字面上看every我能找到的闭包定义使用了相同的神秘而模糊的短语 结束 什么是closure 哦 这是一个函数结束另一个功能 但我找不到 结束 的定义 有人能解释一下 A 事物 关闭 B 事物意味着什么吗 闭包是由代码指