13

I have implemented a curry function this way:

function curry (fn) {
    var slice = Array.prototype.slice,
        args = slice.apply(arguments, [1]);
    return function () {
        fn.apply(null, args.concat(slice.apply(arguments)));
    };
}

When I use the above function to do the following

function add (x, y) {
    return x + y;
}

var inc = curry(add, 1);
console.log(inc(10));

it logs undefined. Isn't 11 the expected output? What is wrong with my code?

Note: Using console.log(x, y) inside the add function logs 1 10. I don't understand why it returns undefined.

Bergi
  • 630,263
  • 148
  • 957
  • 1,375
dheerosaur
  • 14,736
  • 6
  • 30
  • 31

2 Answers2

13

You're missing a return in your curry function.

I.e.

return function () {
    return fn.apply(null, args.concat(slice.apply(arguments)));
};

That seems to work :)

gen_Eric
  • 223,194
  • 41
  • 299
  • 337
Christian Joudrey
  • 3,441
  • 25
  • 25
  • 3
    the correct term for this is partial application of a function - not strictly currying...but still good! – Chii Dec 09 '10 at 04:19
12

This is an example of curry function:

function curry(func) {
    var initial_args = [].slice.apply(arguments, [1]);
    var func_args_length = func.length;

    function curried(args) {
        if (args.length >= func_args_length) {
            return func.apply(null, args);
        }

        return function () {
            return curried(args.concat([].slice.apply(arguments)));
        };
    }

    return curried(initial_args);
}

This curry function creates a curried version of any function. You can partially apply parameters to the new function. For each partial application, it will return a function that takes the rest of the parameters. Once all parameters of the original function are applied, it will return a value.

Eric K Yung
  • 1,754
  • 11
  • 10