Church Numerals
by Paulpro
JavaScript
var zero = function(f){
return function(x){
return x;
}
}
var one = function(f){
return function(x){
return f(x);
}
}
var two = function(f){
return function(x){
return f(f(x));
}
}
two(function(){ console.log('BLAH'); });
// λnfx.f (n f x)
function succ(n){
return function(f){
return function(x){
return f(n(f)(x));
}
}
}
// λnfx.n (λgh.h (g f)) (λu.x) (λu.u)
function pred(n){
return function(f){
return function(x){
return n(function(g){
return function(h){
return h(g(f));
}
})(function(u){
return x;
})(function(u){
return u;
})
}
}
}
// λmnfx.m f (n f x)
function plus(m){
return function(n){
return function(f){
return function(x){
return m(f)(n(f)(x));
}
}
}
}
// λmn.n PRED m
function sub(m){
return function(n){
return n(pred)(m);
}
}
// λmnf.m (n f)
function mult(m){
return function(n){
return function(f){
return m(n(f));
}
}
}
// λxy.x
function TRUE(x){
return function(y){
return x;
}
}
// λxy.y
function FALSE(x){
return function(y){
return y;
}
}
// λpq.p q p
function and(p){
return function(q){
return p(q)(p);
}
}
// λpq.p p q
function or(p){
return function(q){
return p(p)(q);
}
}
// λpab.p b a
function not(p){
return function(a){
return function(b){
return p(b)(a);
}
}
}
// λn.n (λx.FALSE) TRUE
function iszero(n){
return n(function(x){
return FALSE;
})(TRUE);
}
// λpab.p a b
function ifthenelse(p){
return function(a){
return function(b){
return p(a)(b);
}
}
}
function fac(x){
return (function(f){
...