延续的正确术语

2024-03-21

我一直在摸索延续最近,我对正确的术语感到困惑。Here http://www.haskellforall.com/2012/12/the-continuation-monad.html加布里埃尔·冈萨雷斯 说:

Haskell 延续具有以下类型:

newtype Cont r a = Cont { runCont :: (a -> r) -> r }

即整个(a -> r) -> r事情是延续(没有包装)

The 维基百科 http://en.wikipedia.org/wiki/Continuation文章似乎支持这个想法,说

延续是控制状态的抽象表示 计算机程序的一部分。

然而,here http://www.haskell.org/haskellwiki/MonadCont_under_the_hood作者说

延续是代表“剩余的计算要做”的函数。

但那只是(a->r)的一部分Cont类型。这与 Eugene Ching 所说的一致here http://www.codejury.com/continuations-in-haskell/:

需要连续函数的计算(函数) 来全面评估。

我们会经常看到这种功能,因此,我们将给它 一个更直观的名字。我们称它们为等待函数。

我看过另一个教程(Brian Beckman 和 Erik Meijer),他们将整个过程(等待函数)称为可观察到的以及它完成所需的功能observer.

  • 什么是延续、(a->r)->r东西或只是(a->r)东西(没有包装)?
  • 可观察/观察者的措辞是否正确?
  • 上面的引文真的是矛盾的吗?有共同的真理吗?

什么是延续, (a->r)->r 东西还是只是 (a->r) 东西(没有包装)?

我想说的是a -> r位是延续,并且(a -> r) -> r是“连续传递风格”或“是延续单子.

我将在延续的历史上进行一段很长的题外话,这与这个问题并不真正相关……所以请注意。

我相信第一篇发表的关于延续的论文是 Strachey 和 Wadsworth 的“Continuations: A Mathematical Semantics for Handling Full Jumps”(尽管这个概念已经是民间传说)。我认为这篇论文的想法非常重要。命令式程序的早期语义试图将命令建模为状态转换器函数。例如,考虑以下 BNF 给出的简单命令式语言

Command := set <Expression> to <Expression>
         | skip
         | <Command> ; <Command>

Expression := !<Expression>
            | <Number>
            | <Expression> + <Expression>

这里我们使用表达式作为指针。最简单的指称函数解释为state作为从自然数到自然数的函数:

S = N -> N

我们可以将表达式解释为从状态到自然数的函数

E[[e : Expression]] : S -> N

和命令作为状态转换器。

C[[c : Command]] : S -> S

这种指称语义可以非常简单地阐明:

E[[n : Number]](s) = n
E[[a + b]](s) = E[[a]](s) + E[[b]](s)
E[[!e]](s) = s(E[[e]](s))

C[[skip]](s) = s
C[[set a to b]](s) = \n -> if n = E[[a]](s) then E[[b]](s) else s(n)
C[[c_1;c_2]](s) = (C[[c_2] . C[[c_1]])(s)

这种语言的简单程序可能看起来像

set 0 to 1;
set 1 to (!0) + 1

这将被解释为转变状态函数的函数s进入一个新函数,就像s除了它映射0 to 1 and 1 to 2.

这一切都很好,但是你如何处理分支呢?好吧,如果你仔细思考一下,你可能会想出一种方法来处理if以及执行精确次数的循环...但是一般情况呢while loops?

Strachey 和 Wadsworth 向我们展示了如何做到这一点。首先,他们指出这些“状态转换器功能”非常重要,因此决定将它们称为“命令延续”或简称为“延续”。

C = S -> S

由此他们定义了一个新的语义,我们将暂时这样定义

C'[[c : Command]] : C -> C
C'[[c]](cont) = cont . C[[c]]

这里发生了什么?嗯,观察一下

C'[[c_1]](C[[c_2]]) = C[[c_1 ; c_2]]

并进一步

C'[[c_1]](C'[[c_2]](cont) = C'[[c_1 ; c_2]](cont)

我们可以内联定义,而不是这样做

C'[[skip]](cont) = cont
C'[[set a to b]](cont) = cont . \s -> \n -> if n = E[[a]](s) then E[[b]](s) else s(n)
C'[[c_1 ; c_2]](cont) = C'[[c_1]](C'[[c_2]](cont)

这给我们带来了什么?嗯,一种解释方式while,就是这样!

Command := ... | while <Expression> do <Command> end

C'[[while e do c end]](cont) =
  let loop = \s -> if E[[e]](s) = 0 then C'[[c]](loop)(s) else cont(s)
  in loop

或者,使用定点组合器

C'[[while e do c end]](cont) 
    = Y (\f -> \s -> if E[[e]](s) = 0 then C'[[c]](f)(s) else cont(s))

无论如何……那是历史,并不是特别重要……除非它展示了如何以数学方式解释程序,并设置“延续”的语言。

此外,“1. 根据旧的 2. 内联 3. 利润定义新的语义函数”的指称语义方法经常出奇地有效。例如,让你的语义域形成一个lattice(思考,抽象解释)。你怎么得到这个?好吧,一种选择是获取域的幂集,并通过将函数解释为单例来注入该域。如果你内联这个 powerset 结构,你会得到一些可以建模的东西非决定论或者,在抽象解释的情况下,除了程序功能的确切确定性之外,有关程序的各种信息量。

随后还有其他各种工作。在这里,我跳过了许多伟大的论文,例如 lambda 论文……但是,也许最值得注意的是 Griffin 的里程碑式论文“控制的公式作为类型的概念”,该论文显示了连续传递风格与经典逻辑之间的联系。这里强调“延续”和“评估上下文”之间的联系

也就是说,E 表示在计算 N 后仍需要完成的其余计算。在评估序列中,上下文 E 被称为 N 在此时的延续(或控制上下文)。正如我们将在下面看到的,求值上下文的表示法允许对操作延续的运算符的操作语义进行简洁的规范(实际上,这是其预期用途[3,2,4,1])。

明确“继续”是“只是a -> r bit"

这一切都是从语义的角度看待事物,并将延续视为函数。问题是,延续作为函数给你比像计划的 callCC 这样的东西更强大的功能。因此,关于延续的另一个观点是,它们是程序中内部化调用堆栈的变量。 Parigot 的想法是将连续变量作为一个单独的语法类别,从而产生“λμ-微积分:经典自然演绎的算法解释”中优雅的 lambda-mu 微积分。

可观察/观察者的措辞是否正确?

我认为埃里克·梅吉尔 (Eric Mejier) 使用的就是这样。它是学术 PL 中的非标准术语。

上面的引文真的是矛盾的吗?有共同的真理吗?

我们再看一下引用

延续是计算机程序控制状态的抽象表示。

在我的解释中(我认为这是相当标准的),延续模型模拟了程序的含义接下来应该做。我认为维基百科与此一致。

Haskell 延续具有以下类型:

这有点奇怪。但是,请注意,在帖子的后面,加布里埃尔使用了更标准的语言,并且支持我对语言的使用。

这意味着如果我们有一个具有两个延续的函数:

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

延续的正确术语 的相关文章

随机推荐

  • 作用域 bean:将一个 bean 注入另一个 bean

    如何在没有代理的情况下将会话范围 bean 注入另一个会话范围 bean Component Scope session class Foo Inject Bar bar Component Scope session class Bar
  • 如何在Python中浏览内存中的sqlite数据库

    我需要使用内存中的 sqlite 数据库和以下构造函数 db sqlite3 connect memory 但在调试时 我发现它非常不方便 因为与基于文件的数据库不同 我无法在调试器中浏览数据库 有没有办法即时浏览这个数据库 您可以在调试器
  • 在反应性香蕉中进行测试

    有没有办法对用反应性香蕉创建的网络进行单元测试 假设我已经使用一些输入事件建立了一些网络 是否可以验证事件已产生一些输出流 行为在一定数量的输入事件之后具有一定的价值 这样做有意义吗 我注意到有各种interpret 功能 但似乎无法弄清楚
  • IE8 中的 JavaScript 事件原型

    我正在尝试向事件原型添加一个方法 为了呼叫 设置preventDefault 或者 用 IE 来说returnValue false以及 如果需要的话 stopPropagation cancelBubble true 我认为下面的代码就足
  • Pig - 使用正则表达式解析字符串

    我被困在 Pig 中的字符串解析上 我查看了周围的文档regex extract and regex extract all并希望使用其中一项功能 我有文件 logs test log cat logs test log user 2425
  • 针对 HSQLDB 测试 DAO 的 Spring/Hibernate/Junit 示例

    我正在努力尝试实施JUnit测试以检查 DAO 的功能 DAO 将创建 读取基本的对象 表关系 我遇到的麻烦是 DAO 对于非测试代码 的持久性是通过内部解决方案完成的春季 休眠 这消除了通常的 hbm xml我发现的大多数示例都包含模板
  • 如何使用 sass -- precision ?

    我正在尝试使用 sass 指南针来制作流体网格 并且在计算它们时我需要我的 至少有 8 位数字 但现在 sass 指南针将我的小数四舍五入到 3 位数字 我发现如果使用 precision你可以告诉 sass 四舍五入到你想要的数字 我的问
  • 更简单的推送通知,也许询问服务器是否有?

    我正在开发一个IDE 作为管理员 我可以向我的所有客户 移动设备 发送通知 我一直在搜索并找到 GCM 和其他服务 我想知道是否有任何更简单的解决方案 我考虑过每 1 小时从所有客户端 移动设备 向我的服务器发起一次休息呼叫 以检查是否有新
  • 如何使用 Python 在同一 TCL shell 上运行命令

    我所有的库都是用 TCL 编写的 我想用 Python 创建一个 GUI 其中有几个按钮和其他选项 在启动时TCL shell会打开 当我单击按钮时 将在 TCL shell 上执行相应的命令 是否可以在不关闭 TCL shell 的情况下
  • 如何通过 python 中的 pandas 合并来重现 R 中 foverlaps 的相同输出?

    我正在使用 R 合并我的表重叠 https www rdocumentation org packages data table versions 1 10 4 2 topics foverlaps功能 但我需要使用 python 重现相同
  • armv8 NEON if 条件

    我想了解armv8 NEON内联汇编代码中的if条件 在armv7中 这可以通过检查溢出位来实现 如下所示 VMRS r4 FPSCR BIC r4 r4 1 lt lt 27 VMSR FPSCR r4 vtst 16 d30 d30 d
  • Spring Security 的角色和权限

    我正在尝试使用权限设置基于角色的安全性 我正在尝试与 Spring Security 一起做到这一点 我不想设置 ACL 因为这对于我的要求来说似乎有点过分了 我只想拥有简单的权限和角色 如此处所述article http springin
  • Fish shell:接受并运行命令建议的快捷方式

    是否可以创建一个快捷方式 例如 Shift Return 来接受并运行显示的建议 默认的按键绑定需要按箭头键 这涉及远离按键的移动 CTRL f应该完成显示的建议 然后点击Return会运行它
  • java.util.Set添加和删除方法签名差异

    当我在JDK中看到Set java文件时 p This interface is a member of the a href docRoot technotes guides collections index html Java Col
  • SQL Server 分析 - VertiPaqPagingPolicy 设置

    有人知道模式 2 的设置如何工作吗 我找不到任何文档 我想知道分页发生在光盘上的哪个位置 哪个目录设置 这里提到了但不多说 https www jamesserra com archive 2012 05 what happens when
  • 如何在Python的argparse中对同一组参数调用parse_args()两次?

    简化的测试用例 我有一个需要两个参数的脚本 第一个是整数列表 第二个是必须包含在第一个参数的整数集中的单个整数 例如 python argtest py valid nums 1 2 3 num 2 应该可以 但是 python argte
  • INSTALL_FAILED_OLDER_SDK - 错误消息

    我正在使用 Android 2 2 1 的 LG Thrive 手机上尝试基本的 hello world 程序 我为应用程序使用了 API 级别 8 但仍然出现上述错误 标记此错误的任何其他可能原因 编辑 当我在虚拟模拟器中运行应用程序 然
  • 使用 INSERT 查询将一个表中的行复制到另一个表中[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个包含 158 列和 22 0
  • 存储网络应用程序临时数据的最佳实践[重复]

    这个问题在这里已经有答案了 我的最新项目能够使用数据库中的信息生成文档 所以我按需将文档模板复制到用户的临时文件夹中并进行修改 我这样做是因为每个模板在修改期间都必须可用 之后 用户将通过我的网络应用程序的下载链接获得他的文档 我的问题 是
  • 延续的正确术语

    我一直在摸索延续最近 我对正确的术语感到困惑 Here http www haskellforall com 2012 12 the continuation monad html加布里埃尔 冈萨雷斯 说 Haskell 延续具有以下类型