πŸ““ currying.md by @ryan β˜†

currying

Currying, in programming, is a [[functional programming]] technique whereby a [[function]] of n arity is reduced to n unary functions. The term comes from [[lambda calculus]].

const add = (x, y, z) => x + y + z;
const curriedAdd = curry(add);
curriedAdd(1)(2)(3) === curriedAdd(1, 2)(3) === curriedAdd(1)(2, 3) === curriedAdd(1, 2, 3);

Currying could be implemented in [[JavaScript]] as such:

function curry(func) {
  const arity = func.length;

  return function wrapper(...args) {
    if (args.length >= arity) {
      return func(...args);
    } else {
      return function(...otherArgs) {
        return wrapper(...args.concat(otherArgs));
      };
    }
  };
}

const add = (x, y, z) => x + y + z;
const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3) === 6);
console.log(curriedAdd(1, 2)(3) === 6);
console.log(curriedAdd(1)(2, 3) === 6);
console.log(curriedAdd(1, 2, 3) === 6);

In [[Haskell]], all functions are automatically curried:

add x y z = x + y + z

add10 = add 10

add10 100 2