How do you curry any javascript function of arbitrary arity?

前端 未结 5 1940
天命终不由人
天命终不由人 2020-12-19 04:19

Let\'s say I have some function:

function g(a,b,c){ return a + b + c }

And I\'d like to turn it into its \"curried\" form (in quotations si

5条回答
  •  温柔的废话
    2020-12-19 04:45

    How about something like this:

    function makeLazy(fn) {
        var len = fn.length;
        var args = [];
        return function lazy() {
            args.push.apply(args, arguments);
            if (args.length < len) {
                return lazy;
            } else {
                return fn.apply(this, args);
            }
        }
    }
    
    function f(a,b,c) { return a + b + c; }
    
    var lazyF = makeLazy(f);
    lazyF(1)(2)(3); // 6
    
    var lazyF = makeLazy(f);
    lazyF(1,2)(3); // 6
    

    If you wanted a reusable function (I guess I can't tell exactly what you want), then this would work:

    function makeCurry(fn) {
        return function curry() {
            var args = [].slice.call(arguments);
            return function() {
                return fn.apply(this, args.concat.apply(args, arguments));
            };
        }
    }
    
    
    function f(a,b,c) { return a + b + c; }
    
    var curryF = makeCurry(f);
    var addOneTwoAnd = curryF(1,2);
    
    addOneTwoAnd(3); // 6
    addOneTwoAnd(6); // 9
    

提交回复
热议问题