Estaba jugando con Cominators en JavaScript y estaba orgulloso (con suerte) de que S funcionara cuando me encontré con Wikipedia diciendo: "El combinador Y se puede expresar en el SKI- cálculo como: Y = S (K (SII)) (S (S (KS) K) (K (SII)))", por lo que tenía que probar que:Expresando Y en términos de SKI-Combinators en JavaScript
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
¿Qué estoy haciendo mal? ¿No estoy traduciendo esa expresión correctamente? ¿Hay algo de malo en cómo voy sobre esto? ¿Tiene sentido? La mayor parte de lo que se debe leer sobre cosas como esta solo hace que mi cerebro quiera explotar, así que el objetivo de este ejercicio fue principalmente para ver si entendía la notación (y así podría traducirla a JavaScript).
Oh, y, por cierto: lo que me hizo leer & violín de nuevo fue que lo que prototype.js implementa como Prototype.K es en realidad el combinador I. ¿Alguien ha notado?
Hah. +1 para hacer que mi Firefox diga "demasiada recursión". –