我在JavaScript中擺弄Cominators,並且當我偶然發現維基百科說:「Y組合器可以在SKI-積分爲:Y = S(K(SII))(S(S(KS)K)(K(SII)))」,所以我不得不嘗試:在JavaScript中使用SKI組合器表示Y
var I = function (x) {
return x;
};
var K = function (x) {
return function(){
return x;}
};
var S = function (x) {
return function (y) {
return function (z) {
return x(z)(y(z));
}
}
};
var Y = S (K(S(I)(I))) (S(S(K(S))(K)) (K(S(I)(I))));
Y; //evals to:
//function (z) {return x(z)(y(z));}
//And this (lifted from Crockford's Site):
var factorial = Y(function (fac) {
return function (n) {
return n <= 2 ? n : n * fac(n - 1);
};
}); //fails:
//RangeError: Maximum call stack size exceeded
我在做什麼錯?我是不是正確地翻譯這個表達式?我是如何解決這個問題的?它有意義嗎?大部分關於這樣的東西的東西只是讓我的大腦想要爆炸,所以這個練習的重點主要是看看我是否理解了符號(因此可以將它翻譯成JavaScript)。
哦,順便說一句:讓我讀&又一次擺弄的是prototype.js作爲Prototype.K實現的實際上是I combinator。有沒有人注意到?
哈。 +1讓我的Firefox說「太多遞歸」。 –