var fact = function (n) { if (n === 0) return 1; return n * fact(n - 1); }; var True = function (x) { return function (y) { return x; }; }; var False = function (x) { return function (y) { return y; }; }; var If = function (p) { return function (t) { return function (e) { return p(t)(e); } }; }; console.log(If(True)('foo')('bar')); console.log(If(False)('foo')('bar')); var Zero = function (f) { return function (x) { return x; }; }; var Succ = function (n) { return function (f) { return function (x) { return f(n(f)(x)); }; }; }; var IsZero = function (n) { return n(function (x) { return False; })(True); }; Succ(Succ(Succ(Zero)))(function (x) { return x + 1; })(0); console.log(If(IsZero(Zero))('zero')('not zero')); console.log(If(IsZero(Succ(Zero)))('zero')('not zero')); var Mul = function (n) { return function (m) { return function (f) { return n(m(f)); }; }; }; var Pair = function (a) { return function (b) { return function (t) { return t(a)(b); }; }; }; var Fst = function (p) { return p(True); }; var Snd = function (p) { return p(False); }; var Pred = function (n) { return function (s) { return function (z) { return Snd(n(function (p) { return Pair(s(Fst(p)))(Fst(p)); })(Pair(z)(z))); }; }; }; Fst(Pair('foo')('bar')); // => "foo" Snd(Pair('foo')('bar')); // => "bar" Pred(Succ(Succ(Zero)))(function (x) { return x + 1; })(0); // => 1 var fact = function (n) { return If(IsZero(n))(Succ(Zero))(Mul(n)(fact(Pred(n)))); }; var fact = function (n) { return If(IsZero(n))(Succ(Zero))(function (x) { return Mul(n)(fact(Pred(n)))(x); }); }; fact(Succ(Succ(Succ(Zero))))(function (x) { return x + 1; })(0); // => 6 var Y = function (f) { return function (x) { return x(x); }(function (x) { return function (y) { return f(x(x))(y); }; }); }; Y(function (f) { return function (n) { return If(IsZero(n))(Succ(Zero))(function (x) { return Mul(n)(f(Pred(n)))(x); }); }; })(Succ(Succ(Succ(Zero))))(function (x) { return x + 1; })(0); // => 6 var fact = function (x) { return x(x); }(function (x) { return function (y) { return function (f) { return function (n) { return If(IsZero(n))(Succ(Zero))(function (x) { return Mul(n)(f(Pred(n)))(x); }); }; }(x(x))(y); }; }); var NatToChurch = function (n) { return n == 0 ? Zero : function (f) { return function (x) { return f(NatToChurch(n - ChurchToNat(Succ(Zero)))(f)(x)); }; }; }; var ChurchToNat = function (n) { return n(function (x) { return x + 1; })(0); }; ChurchToNat(fact(NatToChurch(5))); // => 120 var fact = function (x) { return x(x); }(function (x) { return function (y) { return function (f) { return function (n) { return function (p) { return function (t) { return function (e) { return p(t)(e); } }; }(function (n) { return n(function (x) { return function (x) { return function (y) { return y; }; }; })(function (x) { return function (y) { return x; }; }); }(n))(function (n) { return function (f) { return function (x) { return f(n(f)(x)); }; }; }(function (f) { return function (x) { return x; }; }))(function (x) { return function (n) { return function (m) { return function (f) { return n(m(f)); }; }; }(n)(f(function (n) { return function (s) { return function (z) { return function (p) { return p(function (x) { return function (y) { return y; }; }); }(n(function (p) { return function (a) { return function (b) { return function (t) { return t(a)(b); }; }; }(s(function (p) { return p(function (x) { return function (y) { return x; }; }); }(p)))(function (p) { return p(function (x) { return function (y) { return x; }; }); }(p)); })(function (a) { return function (b) { return function (t) { return t(a)(b); }; }; }(z)(z))); }; }; }(n)))(x); }); }; }(x(x))(y); }; }); Source: https://habr.com/ru/post/248331/
All Articles