// Y combinator // \f.(\x.f (x x)) (\x.f (x x)) // Translated from https://gist.github.com/logicmason/0722b5b159a45f7a81b6 var Y = fn => (x => fn(y => x(x)(y))) (x => fn(y => x(x)(y))) ; var factgen = (fact) => n => (n === 0) ? 1 : n * fact(n-1) ; var factorial = Y(factgen); console.log(factorial(5));