用JavaScript中的SKI组合器表示Y
-
28-10-2019 - |
题
当我偶然发现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
的无限调用。