Crockford FEM session

by James Greene

JavaScript

var identity = function(f) {
    return f;
};

var add = function(a, b) {
    return a + b;
};

var mul = function(a, b) {
    return a * b;
};

var identityf = function(f) {
    return function() {
        return f;
    };
};

var addf = function(a) {
    return function(b) {
        return a + b;
    };
};

var applyf = function(f) {
    return function(a) {
        return function(b) {
            return f(a, b);
        };
    };
};

var curry = function(f, a) {
    return function(b) {
        return f(a, b);
    };
};

var curry2 = function(f, a) {
    return applyf(f)(a);
};

var inc_impl1 = addf(1);
var inc_impl2 = applyf(add)(1);
var inc_impl3 = curry(add, 1);

var methodize1 = function(f) {
    return function(b) {
        return f(this, b);
    };
};

var methodize2 = function(f) {
    return function() {
        var args = Array.prototype.slice.call(arguments, 0);
        args.unshift(this);
        return f.apply(this, args);
    };
};

Number.prototype.add = methodize1(add);
Number.prototype.mul = methodize2(mul);

var demethodize = function(f) {
    return function(a, b) {
        return f.call(a, b);
    };
};

var twice = function(f) {
    return function(a) {
        return f(a, a);
    };
};

var double = twice(add);
var square = twice(mul);

var composeu = function(f, g) {
    return function(a) {
        return g(f(a));
    };
};

console.log("identity(3) === " + identity(3));
console.log("add(3, 4) === " + add(3, 4));
console.log("mul(3, 4) === " + mul(3, 4));
console.log("identityf(3)() === " + identityf(3)());
console.log("addf(3)(4) === " + addf(3)(4));
console.log("applyf(add)(3)(4) === " + applyf(add)(3)(4));
console.log("applyf(mul)(5)(6) === " + applyf(mul)(5)(6));
console.log("curry(add, 3)(4) === " + curry(add, 3)(4));
console.log("curry(mul, 5)(6) === " + curry(mul, 5)(6));
console.log("curry2(add, 3)(4) === " + curry2(add, 3)(4));
console.log("curry2(mul, 5)(6) === " + curry2(mul, 5)(6));
console.log("inc_impl1(5) === " +...