Write a function that evaluates the following expression.
function sum(a, b, c, d) { return a + b + c + d; } let curriedSum = curry(sum); console.log(curriedSum(1,2,3,4,5)); // 10 console.log(curriedSum(1)(2,3)(4,5)); // 10 console.log(curriedSum(1)(2)(3)(4)); // 10
This is the fourth question in the series of currying where we use Closure to solve problems in JavaScript.
- Currying – part 3
- Currying in JavaScript
- Javascript function that returns sum of the previous values
Currying in JavaScript is a concept of functional programming in which we can pass functions as arguments (callbacks) and return functions without any side effects (Changes to program states).
If you see the problem statement, we have a callback function sum(a, b, c, d)
that accepts four arguments and return total of those. This callback function is passed to curry
that returns a new function.
When the number of arguments in this returned function becomes equal to the number of arguments that callback function is expected, the curriedSum()
returns the total, else it keeps returning another function that keeps accepting arguments and so on.
To implement this, we will create a helper function in the curry()
and return it.
Inside the helper function we will check if the number of arguments it has received is greater than or equal to the arguments that callback function is expecting. For this we will use the length property that is available to the functions in JavaScript function.length
that returns the size of arguments it is accepting.
If the condition fulfils, then pass the arguments to the callback function and return the output.
Else, return a new function that will accept the argument and recursively pass the combined arguments to the curry
function again.
let curry = (fn) => { // helper function let helper = (...args) => { // if we are receiving the expected number of arguments if(args.length >= fn.length){ // pass it to callback fn return fn(...args); }else{ // return a new function that will accept the remaining arguments let temp = (...args2) => { // recursively call the same function // to validate if we have received the required amount // of arguments return helper(...args, ...args2); }; // return the function return temp; } }; // return helper return helper; }
Input: function sum(a, b, c, d) { return a + b + c + d; } let curriedSum = curry(sum); console.log(curriedSum(1,2,3,4,5)); console.log(curriedSum(1)(2,3)(4)); console.log(curriedSum(1)(2)(3)(4)); Output: 10 10 10