私はJavaScriptでCominatorsを抱いていて、Wikipediaを見つけたときにSがうまく動作することを誇りに思っていました。「YコンビネータはSKI-計算:Y =のS(K(SII))(S(S(KS)K)(K(SII)))」ので、私はそれを試していた:私は間違ってJavaScriptのSKI-Combinatorsで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が実装しているのは実際には私のコンビネータです。誰か気づいた?
Hah。私のFirefoxを「あまりにも多くの再帰」と言うための+1。 –