Я вошел с коминкаторами в JavaScript и гордился (надеюсь) Получение S для работы, когда я наткнулся на Википедию, говоря: «У комбинатора Y можно выразить в лыжном исчислении как: y = s (k (sii)) (s (s (ks) k) (k (sii)))) «Так что мне пришлось попробовать это:
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).
О, и, кстати: что заставило меня читать и возобновить снова, было то, что прототип. Джей реализует как прототип. Кто-нибудь заметил?