当我偶然发现Wikipedia时说:“ Y组合器可以表示为:Y= S(K(SII))(S(S(KS(K)K)(K(SII))))”,所以我不得不尝试: 通用标签

我在做什么错?我不能正确翻译该表达吗?我要怎么做这有什么问题吗?有道理吗?关于此类内容的大部分阅读内容只是使我的大脑想要爆炸,所以对我来说,本练习的重点主要是看我是否理解该表示法(并因此能够将其转换为JavaScript)。

哦,顺便说一句:让我再次阅读和摆弄的是,prototype.js作为Prototype.K实现的实际上是我的组合器。有人注意到吗?

有帮助吗?

解决方案

这里的问题是您正在使用经过严格评估的编程语言。 Y组合器几乎与任何其他定点组合器一样,仅在需要调用或“懒惰求值”函数时才能正常工作。

我知道一种解决此问题的方法(我的一位教授调查了),但是它将使您的代码完全不可读。

下面,我已经展示了到底发生了什么,希望您能明白为什么JavaScript无法处理SKI演算的直接实现。


这是JavaScript评估您的SKI表达式后,Y的样子: 通用标签

现在让我们看看如果您将其输入函数function (fac) { ... },会发生什么。我们称该函数为f 通用标签

由于第一个匿名函数被应用到一个参数,它将被评估为: 通用标签

在懒惰的评估语言中,f的参数现在将被保留,而f本身将被评估。但是,由于JavaScript是一种经过严格评估的语言(或“按值调用”),因此它想知道在实际运行该函数之前需要将什么参数传递给函数f。那么,让我们评估一下这个论点吧? 通用标签

我想现在您开始发现问题出在哪里,以及Y组合器的实际工作原理。在任何情况下,您的JavaScript机器都将耗尽堆栈空间,因为它试图建立对f的无限调用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top