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