JavaScript로 코미네이터를 만났을 때 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가 Prototype.K로 구현 한 것이 실제로 I 결합 자임을 의미합니다. 누군가 주목 했습니까?
ah. 내 Firefox가 "너무 많은 재귀"라고 말하기 위해 +1. –