问题标签 [y-combinator]

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 回答
314 浏览

ios - 将带有转义闭包的闭包传递给接受该类型闭包的函数的问题

在旧的 swift 世界(我相信 2.0)中,我有以下 Y-combinator 实现

我会在别处调用 Y-comb 来创建递归闭包,如下所示:

这个想法是,当“sendData”通知的观察者收到他的回复时,他会向班级发送一个通知,其中包含我的 Y 组合器和重复闭包。一旦“sendData”通知的所有观察者实例都收到了它们的数据,

会是真的,我们不会再调用 f() 了。

现在,我的问题是转换为 Swift 3.0 迫使我在 Y 的定义上明确声明 'f' 的类型为 @escaping,如下所示:

并随后将我的重复闭包转换为具有相同类型。这很好,我了解@escaping 和@noescape 之间的区别以及我的代码需要它的原因。但是,在尝试构建时,我收到关于类型不匹配的编译错误:

我创建了一个简单的示例闭包,只是为了测试它会给出相同的错误:

而以下没有问题:

我得到了 fixit 的建议,强制强制转换为类型,没有 @escaping 标记。这可以编译,但感觉不对,我还没有实际测试过该演员表是否真的会在运行时工作。

我在这里想念什么?

0 投票
1 回答
462 浏览

functional-programming - StandardML 中的 y 组合器

我知道我可以像这样在 SML 中编写 y-combinator:首先声明一个新的数据类型来绕过由于循环导致的类型不匹配。

现在您可以轻松定义 y 组合器:

然后你就完成了,你可以像这样使用它:


我的问题是:还有其他方法可以在 SML 中实现 y 组合器吗?

0 投票
1 回答
515 浏览

javascript - y-combinator in javascript

I have built a y-combinator in js like this

and I simplified this code like this

this get an infinite recursion. What's the difference between these two versions?

0 投票
1 回答
689 浏览

kotlin - 如何使用 Kotlin 编写 Y-combinator 函数?

我可以使用 Kotlin FP (Lambda, function) 编写 Y-combinator 函数吗?

在 JS 中:

在咖啡中:

我怎样才能做到这一点?

0 投票
2 回答
755 浏览

recursion - 如何使用方案 lisp 实现 lambda 演算的迭代?

我正在尝试学习 lambda 演算和 Scheme Lisp。关于 lambda 演算的教程可以在这里找到http://www.inf.fu-berlin.de/lehre/WS03/alpi/lambda.pdf

我面临的问题是我不知道如何正确实现迭代。

我总是收到这个错误:

中止!:超出最大递归深度

我知道问题在于评估顺序:该方案(Y sum)首先解释,这导致无限递归:

但我想要

我怎么解决这个问题?谢谢。

0 投票
1 回答
232 浏览

scheme - 理解 Scheme 中 Y Combinator 中的额外参数

根据RosettaCode,Scheme 中的 Y Combinator 实现为

当然,传统的 Y Combinator 是λf.(λx.f(xx))(λx.f(xx))

那么,我的问题是 abouthargs,它没有出现在数学定义中,以及 about apply,它似乎应该在 Combinator 的两半中,或者都不在。

有人可以帮我理解这里发生了什么吗?

0 投票
2 回答
275 浏览

recursion - Little Schemer:为什么将 (mk-length mk-length) 包装成一个函数?

The Little Schemer book的第 9 章中,在为任意长输入构建length函数时,建议如下(在第 170-171 页),在以下代码片段中(来自第 168 页本身):

part (mk-length mk-length), 将永远不会返回,并将无限地应用于自身:

因为我们只是mk-length一次又一次地向自己申请......

但是现在我们已经(mk-length mk-length)从使它length不再返回函数的函数中提取出来了。

现在,为了解决这个问题,本书建议:

mk-length我们最后一个正确版本 of 中 to 自身的应用length变成一个函数。

就像,所以:

我感到困惑的是:

  1. 如果(mk-length mk-length)

    不返回函数

    我们如何将结果应用(mk-length mk-length)到某个东西上,就好像它是一个函数一样?

    /li>
  2. 包装(mk-length mk-length)成函数如何解决“永不返回”(即无限递归)问题?我的理解是,在:

    /li>

x只会被传递给永远不会返回的无限递归函数。

0 投票
1 回答
184 浏览

caching - 如何使用 Y-combinator 为这个函数获取缓存

我有一个coins = [200; 100; 50; 20; 10; 5; 2; 1] 列表和这个递归函数来计算有多少种方法可以给出一定数量的变化(欧拉项目问题 31的剧透警报):

除了StackOverflowException大值之外,该函数需要很长时间。所以我想起了Y 组合器,并且很好奇如何将它应用到这个问题上。通过一点帮助和对函数签名的两个小改动,我得出了这个结论:

这有效,现在我想使用字典进行缓存。但为此,我不知道如何处理acc和的coins论点f

在下面的代码中,字典已经有了一个疯狂的类型。在对函数进行柯里化后,它变成了一个int -> int64,所以我希望我的字典有这两个类型参数,但事实并非如此。它编译并给出了正确的答案,但对于大输入来说它仍然很慢——对于那种类型来说不足为奇。

我尝试在所有地方粘贴两个初始化参数0L和列表,但我无法让任何其他变体正常工作。

我怎样才能使这个例子中的缓存工作,我。e. 如何修复参数以使我的缓存属于类型Dictionary<int, int64>


PS:我知道 myf不是尾递归的,所以我可以用accumulator 参数省去麻烦(也需要学习延续)。

0 投票
2 回答
225 浏览

javascript - 带有 ES6 Y-combinator 的 Javascript 中的有限递归

我遇到了另一个关于 Javascript 中递归的 SO 问题的答案,它使用 Y-combinator 在 ES6 中给出了一个非常简洁的形式,使用 ES6 的胖箭头,并认为嘿,使用起来会很整洁- 然后 15 分钟左右后来又绕回hm,也许不是

我之前参加过一些 Haskell/Idris 讲座并运行过一些代码,并且熟悉标准 JS,所以希望我能够弄清楚这一点,但不太明白如何简单地“进行n递归并返回” " 应该去,以及在哪里实现一个递减计数器。

我只是想简化获取DOM 元素的n第 th 个父节点,并且似乎有比这样的简单应用程序示例更密集的解释所有指南。

我第一次看到的例子是:

虽然这个更新的答案给出了:

...给出了内部功能可能是什么的示例,以及一些示例输出,但是引入 U-combinator 并不能真正帮助我澄清这一点。

在第一个示例中,我无法真正开始理解b我的情况 - 我知道我需要一个函数a来返回父节点:

我想出了以下内容:

但是后来看不到如何处理闲置的备用b,并且正要将其全部删除而忘记了我的困扰。

我只想应用par函数n时间,因为我知道的唯一选择是链接.parentNode.parentNode.parentNode......或作弊并将字符串转换为eval调用。

希望熟悉函数式 JS 的人可以帮助我了解如何使用 Y-combinator 来制作这个辅助函数RecParentNode- 谢谢!

0 投票
2 回答
120 浏览

lambda - (self self) 在 let 语句中调用,用严格的语言

我目前正在阅读Mike Vanier关于 Y-combinator 的这篇文章。 在 Y-combinator 推导的过程中,这段代码:

被制定为:

在那之后,文章指出:

这在惰性语言中可以正常工作。在严格的语言中,(self self)let 语句中的调用会将我们送入无限循环,因为为了计算(part-factorial part-factorial)(在阶乘的定义中),您首先必须计算(部分阶乘部分阶乘)(在let表达式中) .

然后读者受到挑战:

为了好玩:弄清楚为什么这不是以前的定义的问题。

在我看来,我已经弄清楚了原因,但我想确认一下:

  1. 我的理解是正确的。
  2. 据我了解,我不会错过任何关键点。

我的理解是:在第一个代码片段中,(self self)调用不会导致无限循环,因为它被包含(包装)lambda为一个part-factorial函数,因此被评估为lambda (n)直到实际进行调用(self self),这仅发生在n > 0. 因此,在(= n 0)评估为之后#t,无需调用(self self)