Stavo armeggiando con i Cominator in JavaScript ed ero orgoglioso di (si spera) riuscendo a far funzionare S quando mi sono imbattuto in Wikipedia dicendo: "Il combinatore Y può essere espresso nello SKI- calcolo come: Y = S (K (SII)) (S (S (KS) K) (K (SII)))", così ho dovuto provare che:Esprimendo Y in termini di Combinatori SKI in 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
che cosa sto facendo di sbagliato? Non sto traducendo correttamente quell'espressione? C'è qualcosa di sbagliato in come sto andando su questo? Ha senso? La maggior parte di ciò che si deve leggere su cose del genere fa desiderare al mio cervello di esplodere, quindi il punto di questo esercizio per me è stato principalmente quello di vedere se ho compreso la notazione (e sarei quindi in grado di tradurla in JavaScript).
Oh, e, a proposito: quello che mi ha fatto leggere di nuovo & giocherellare di nuovo è stato quello che prototype.js implementa come Prototype.K è in realtà il combinatore I. Qualcuno ha notato?
Hah. +1 per far dire al mio Firefox "troppa ricorsione". –