Closures & Scopehard

Implement curry(fn)

Write a `curry` function that transforms a multi-argument function into a sequence of unary functions. `curry(add)(1)(2)(3)` should equal `add(1, 2, 3)`.

Asked at Meta, Google

#closures#functional programming#recursion

Answer

function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args)
    }
    return function (...moreArgs) {
      return curried.apply(this, args.concat(moreArgs))
    }
  }
}

// Usage
function add(a, b, c) { return a + b + c }
const curriedAdd = curry(add)

curriedAdd(1)(2)(3)     // 6
curriedAdd(1, 2)(3)     // 6
curriedAdd(1)(2, 3)     // 6
curriedAdd(1, 2, 3)     // 6

Source: frontendinterviewhandbook.com

Practise more Closures & Scope questions →