JavaScript Y Combinator

#JavaScript  #FP

ES5 Style

var Y = function(f) {
    return (function(x) {
       return f(function(a) {
           return (x(x))(a);
       });
    })(function(x) {
        return f(function(a) {
            return (x(x))(a);
        });
    });
}

var fibo = Y(function(self) {
    return function(x) {
        if (x <= 2) return 1;
        return self(x - 1) + self(x - 2);
    }
});

console.log(fibo(10)); // 55

Modern ES Style

let Y = f => (x => f(a => (x(x))(a)))(x => f(a => (x(x))(a)))

let fibo = Y(self => x => {
    if (x <= 2) return 1;
    return self(x - 1) + self(x - 2);
});

console.log(fibo(10)); // 55