Tôi đã không hài lòng với các Cominator bằng JavaScript và được tự hào về (hy vọng) khiến S hoạt động khi tôi tình cờ gặp Wikipedia nói: "Bộ kết hợp Y có thể được thể hiện trong SKI- calculus như: Y = S (K (SII)) (S (S (KS) K) (K (SII)))", vì vậy tôi đã phải cố gắng rằng:Biểu thị Y theo thuật ngữ SKI-Combinators trong 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
tôi đang làm gì sai? Tôi không dịch chính xác biểu thức đó? Có điều gì sai trái với việc tôi sẽ làm thế nào không? Nó thậm chí có ý nghĩa không? Hầu hết những gì cần đọc về những thứ như thế này chỉ khiến não tôi muốn nổ tung, nên điểm của bài tập này đối với tôi chủ yếu là xem tôi có hiểu được ký hiệu không (và do đó có thể dịch nó sang JavaScript).
Ồ, và, nhân tiện: điều gì khiến tôi đọc lại & một lần nữa là những gì prototype.js thực hiện như Prototype.K thực sự là bộ phối hợp I. Có ai để ý không?
Hah. 1 để làm cho Firefox của tôi nói "quá nhiều đệ quy". –