问题标签 [combinators]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1183 浏览

lambda - 如何在魔法森林中创建一个 K 组合器?(模仿知更鸟)

回想一下,K 组合子是一个常数函数。它总是返回它的第一个参数:

在《模仿一只知更鸟》一书中,作者展示了一个包含会说话的鸟儿的魔法森林的例子。鸟类有以下行为:

给定任何鸟 A 和 B,如果你向 A 喊 B 的名字,那么 A 会通过向你呼唤某种鸟的名字来回应:我们将用 AB 指定这只鸟。

假设森林由三只鸟 A、B 和 C 组成。是否有可能至少有一只鸟表现得像 K 组合子?

下表显示了魔法森林中鸟类可能的一组行为。第一列是森林中每只鸟的名字。最上面一行有可以叫到每只鸟的名字。身体是鸟对名字的反应。例如,如果你向鸟 A 喊 A 的名字,那么鸟 A 会用 C 回应(见第 2 行第 2 列)。简而言之,AA = C。如果你向鸟 A 喊 B 的名字,那么鸟 A 会用 B 回应(见第 2 行第 3 列)。简而言之,AB = B。AC 的空槽应该输入什么值?

让我们看看我们是否可以让鸟 A 表现得像 K 组合器。上面的一组值看起来很有希望:

  • 对于所有 y,AA = C 和 Cy = A。也就是说,对于所有 y,(AA)y = A。

  • 对于所有 y,AB = B 和 By = B。也就是说,对于所有 y,(AB)y = B。

应该在空槽(AC)中放置什么值?考虑所有情况:

  • 如果 AC = A,那么对于所有 y,Ay 的值必须是 C,这显然是错误的。因此 A 不能是空槽的正确值。

  • 如果 AC = B,那么对于所有 y,By 的值必须是 C,这显然是错误的。因此 B 不可能是空槽的正确值。

  • 如果 AC = C,那么对于所有 y,Cy 的值必须是 C,这显然是错误的。因此 C 不能是空槽的正确值。

因此,对于每个 y,都不能在空槽中放置任何值来满足条件 (AC)y = C。

据我所知,不可能让任何鸟表现得像 K 组合子。我希望你能证明我错了。

0 投票
1 回答
214 浏览

.net - IObservable 订阅的自我错误相关的自我处置

我有如下所示的 F# 代码:


在哪里

  • cs保留直到c.SendAll失败的最惯用的方法是什么?
  • 是否有或者是否可以定义Observable.subscribeUntilError(action)如果action失败,订阅会在哪里被处理;否则action只要IObservable一直推就跑?
0 投票
1 回答
1594 浏览

clojure - 如果需要,clojure 可以评估一系列混合的 arity 函数并返回部分函数吗?

假设您具有以下三个函数,即 arity 1、2 和 3:

clojure 是否有评估函数或习语来评估:

返回 arity 2 的偏函数?

我正在考虑创建一个宏,它可以采用上面的简单函数定义并将它们扩展为可以返回部分结果的多参数函数。如果已经有内置或惯用的方法来完成此操作,我不想创建宏。

以下是扩展宏对上述功能的要求:

0 投票
1 回答
483 浏览

functional-programming - 无法实现 Y 组合器工作

这是代码(也在这里):

当我运行它时:

屏幕截图如下所示:

在此处输入图像描述

我使用 DrRacket 作为 repl。代码有什么问题?

0 投票
2 回答
343 浏览

ruby - 在 ruby​​ 中实现 iota

我提前道歉再次提出这个问题。我之前就在这里的 Haskell 实现问过这个问题,但我仍然很难理解它是如何工作的。此外,我发现极简编程语言的概念绝对令人着迷并且无法摆脱它......无论如何,这不是怀念函数式编程之美的地方。

所以!我找到了一个关于深奥编程语言的网站并发现了 Iota。Iota 可以说是最小的函数式语言。您可以在此处阅读更多相关信息:“Iota 和 Jot:最简单的语言?” 这是Iota在Scheme中的参考实现:

但是,当我尝试与 Ruby 中的 Scheme 实现相当的优雅时,它最终会吐出一个“坏 proc”。谁能帮我理解为什么 Ruby 会这样,以及如何更好地实现它。在尝试使其正常工作时,我保留S,KBASIS分开只是为了便于阅读。

我在底部包括了两个测试。第一个应该返回I( BASIS[BASIS]),但它返回的结果与I. 第二个测试应该返回K,但它返回一个错误。

0 投票
2 回答
1628 浏览

lisp - lisp 中的定点组合器

我想了解这个结构。有人可以对此代码给出清晰简单的解释吗?

例如,假设我忘记了 Y 的公式。我怎么能记住它,并在我使用它很久之后重现它?

0 投票
2 回答
574 浏览

parsing - 预处理 Scala 解析器阅读器输入

我有一个包含对象的文本表示的文件。我编写了一个组合器解析器语法来解析文本并返回对象。在文本中,“#”是注释分隔符:从该字符到行尾的所有内容都将被忽略。空行也被忽略。我想一次处理一行文本,这样我就可以处理非常大的文件。

我不想用通用注释和空行逻辑弄乱我的解析器语法。我想删除这些作为预处理步骤。通过行将文件转换为迭代器,我可以执行以下操作:

如何将这样的表达式的输出传递给组合器解析器?我不知道如何Reader从这样的过滤表达式中创建一个对象。JavaFileReader接口不是这样工作的。

有没有办法做到这一点,或者我应该把我的评论和空行逻辑放在解析器语法中?如果是后者,是否有一些util.parsing包已经为我做了这个?

0 投票
2 回答
2090 浏览

lambda - 在 lambda 演算中定义堆栈数据结构及其主要操作

我正在尝试stack使用定点组合器在 lambda 演算中定义数据结构。我正在尝试定义两个操作,insertion以及removal元素的 sopushpop,但我能够定义的唯一一个操作,即插入,无法正常工作。删除我无法弄清楚如何定义。

这是我的push操作方法,以及我对 a 的定义stack

我的堆栈用一个元素初始化以指示底部;我在0这里使用:

但是现在,当我尝试插入另一个元素时,它不起作用,因为我的初始结构已被解构。

如何修复STACK定义或PUSH定义,以及如何定义POP操作?我想我必须应用一个组合器来允许递归,但我不知道该怎么做。

参考:http ://en.wikipedia.org/wiki/Combinatory_logic

任何关于 lambda 演算中数据结构定义的进一步解释或示例将不胜感激。

0 投票
2 回答
693 浏览

haskell - Haskell:为什么 ((.).(.)) fg 等于 f 。gx?

你能解释一下表达式 ((.).(.)) 的含义吗?据我所知 (.) 的类型为 (b -> c) -> (a -> b) -> a -> c。

0 投票
1 回答
502 浏览

scheme - 两层“Y 型”组合器。这很常见吗?这个有官方名称吗?

我一直在研究禁止 use-before-def 并且没有可变单元格(no set!or setq)的语言如何提供递归。我当然遇到了(著名的?臭名昭著的?)Y 组合器和朋友,例如:

当我以这种风格实现“letrec”语义时(也就是说,允许定义一个局部变量,使其可以是一个递归函数,在幕后它永远不会引用它自己的名字),组合器我最终写成这样:

或者,分解出 U 组合子:

将其读作: Y_letrec 是一个函数,它接受一个待递归函数ff必须是一个接受的单参数函数s,其中sf可以调用实现自递归的函数。f预计将定义并返回执行“真实”操作的“内部”函数。该内部函数接受参数a(或者在一般情况下是参数列表,但不能用传统符号表示)。调用 Y_letrec 的结果是调用的结果 f,并且它被假定为一个“内部”函数,准备被调用。

我这样设置的原因是我可以直接使用待递归函数的解析树形式,而无需修改,只需在处理 letrec 时在转换过程中围绕它包裹一个额外的函数层。例如,如果原始代码是:

那么转换后的形式将是:

请注意,两者之间的内部函数体是相同的。

我的问题是:

  • 我的 Y_letrec 函数常用吗?
  • 它有一个公认的名字吗?

注意:上面的第一个链接引用了与“应用顺序 Y 组合器”类似的函数(在“步骤 5”中),尽管我在找到该命名的权威来源时遇到了麻烦。

2013 年 4 月 28 日更新:

我意识到上面定义的 Y_letrec非常接近但不等同于维基百科中定义的 Z 组合子。根据 Wikipedia,Z 组合器和“按值调用 Y 组合器”是同一个东西,看起来这确实是更常被称为“应用顺序 Y 组合器”的东西。

所以,我上面所说与通常写的应用顺序 Y 组合子不同,但几乎可以肯定它们是相关的。这是我进行比较的方法:

从...开始:

应用内部 U:

应用外部 U:

重命名以匹配 Wikipedia 对 Z 组合子的定义:

将此与维基百科的 Z 组合器进行比较:

显着的区别在于函数f的应用位置。有关系吗?尽管存在这种差异,这两个功能是否等效?