问题标签 [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.
ios - 将带有转义闭包的闭包传递给接受该类型闭包的函数的问题
在旧的 swift 世界(我相信 2.0)中,我有以下 Y-combinator 实现
我会在别处调用 Y-comb 来创建递归闭包,如下所示:
这个想法是,当“sendData”通知的观察者收到他的回复时,他会向班级发送一个通知,其中包含我的 Y 组合器和重复闭包。一旦“sendData”通知的所有观察者实例都收到了它们的数据,
会是真的,我们不会再调用 f() 了。
现在,我的问题是转换为 Swift 3.0 迫使我在 Y 的定义上明确声明 'f' 的类型为 @escaping,如下所示:
并随后将我的重复闭包转换为具有相同类型。这很好,我了解@escaping 和@noescape 之间的区别以及我的代码需要它的原因。但是,在尝试构建时,我收到关于类型不匹配的编译错误:
我创建了一个简单的示例闭包,只是为了测试它会给出相同的错误:
而以下没有问题:
我得到了 fixit 的建议,强制强制转换为类型,没有 @escaping 标记。这可以编译,但感觉不对,我还没有实际测试过该演员表是否真的会在运行时工作。
我在这里想念什么?
functional-programming - StandardML 中的 y 组合器
我知道我可以像这样在 SML 中编写 y-combinator:首先声明一个新的数据类型来绕过由于循环导致的类型不匹配。
现在您可以轻松定义 y 组合器:
然后你就完成了,你可以像这样使用它:
我的问题是:还有其他方法可以在 SML 中实现 y 组合器吗?
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?
kotlin - 如何使用 Kotlin 编写 Y-combinator 函数?
我可以使用 Kotlin FP (Lambda, function) 编写 Y-combinator 函数吗?
在 JS 中:
在咖啡中:
我怎样才能做到这一点?
recursion - 如何使用方案 lisp 实现 lambda 演算的迭代?
我正在尝试学习 lambda 演算和 Scheme Lisp。关于 lambda 演算的教程可以在这里找到http://www.inf.fu-berlin.de/lehre/WS03/alpi/lambda.pdf。
我面临的问题是我不知道如何正确实现迭代。
我总是收到这个错误:
中止!:超出最大递归深度
我知道问题在于评估顺序:该方案(Y sum)
首先解释,这导致无限递归:
但我想要
我怎么解决这个问题?谢谢。
scheme - 理解 Scheme 中 Y Combinator 中的额外参数
根据RosettaCode,Scheme 中的 Y Combinator 实现为
当然,传统的 Y Combinator 是λf.(λx.f(xx))(λx.f(xx))
那么,我的问题是 abouth
和args
,它没有出现在数学定义中,以及 about apply
,它似乎应该在 Combinator 的两半中,或者都不在。
有人可以帮我理解这里发生了什么吗?
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
变成一个函数。
就像,所以:
我感到困惑的是:
如果
(mk-length mk-length)
不返回函数
我们如何将结果应用
/li>(mk-length mk-length)
到某个东西上,就好像它是一个函数一样?包装
/li>(mk-length mk-length)
成函数如何解决“永不返回”(即无限递归)问题?我的理解是,在:
x
只会被传递给永远不会返回的无限递归函数。
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
不是尾递归的,所以我可以用acc
umulator 参数省去麻烦(也需要学习延续)。
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
- 谢谢!
lambda - (self self) 在 let 语句中调用,用严格的语言
我目前正在阅读Mike Vanier关于 Y-combinator 的这篇文章。
在 Y-combinator 推导的过程中,这段代码:
被制定为:
在那之后,文章指出:
这在惰性语言中可以正常工作。在严格的语言中,
(self self)
let 语句中的调用会将我们送入无限循环,因为为了计算(part-factorial part-factorial)
(在阶乘的定义中),您首先必须计算(部分阶乘部分阶乘)(在let
表达式中) .
然后读者受到挑战:
为了好玩:弄清楚为什么这不是以前的定义的问题。
在我看来,我已经弄清楚了原因,但我想确认一下:
- 我的理解是正确的。
- 据我了解,我不会错过任何关键点。
我的理解是:在第一个代码片段中,(self self)
调用不会导致无限循环,因为它被包含(包装)lambda
为一个part-factorial
函数,因此被评估为lambda (n)
直到实际进行调用(self self)
,这仅发生在n > 0
. 因此,在(= n 0)
评估为之后#t
,无需调用(self self)
。