Вот ты go.
var log = function(x) {
console.log(x)
return x
}
var zero = function(f) {
return function(x) {
return x;
};
};
var one = function(f) {
return function(x) {
return f(x);
};
};
function add(n, m) {
return function(f) {
return function(x) {
return n(f)(m(f)(x));
};
};
}
// test, define number two and number three in lambda calculus
var two = add(one, one);
var three = add(one, two);
// function f is to console.log
var print3times = three(log);
print3times("hello world")
Вот перевод ES6 с несколькими бонусными функциями для развлечения:
const log = x => (console.log(x), x)
const identity = x => x
const compose = f => g => x => f(g(x))
const zero = f => identity
const one = f => x => f(x)
// I took the liberty of currying add
const add = n => m => f => x => n(f)(m(f)(x))
// test, define number two and number three in lambda calculus
const addOne = add(one)
const two = addOne(one)
const three = addOne(two)
const four = compose(addOne)(addOne)(two)
// function f is to console.log
const print3times = three(log)
print3times("hello world")
four(log)('hi X 4')
Также вы можете найти эти два видео на YouTube под названием «Стая функций: комбинаторы, лямбда-исчисление и церковные кодировки в JS», информативные: Часть 1 , часть 2 .