currying function’s usages, pros and cons
‘Currying’ has the same spelling as Curry that we love.
But ‘currying’ is derived from the name Haskell Brooks Curry who was known as a mathematician and a logician.
Currying is a technique that converting multiple arguments function into a single argument functions sequence.
Like this.
func(a, b, c) -> f(a)(b)(c)
Three arguments function is converted into three functions with single argument each.
f(a) returns value and (b) takes this value as a parameter. (c) also do the same thing. Get’s (b)‘s return value and return.
//non-curried function plusFunc(a, b, c){ console.log(a + b + c); } plusFunc(1, 2, 3); // 6 //curried function plusFunc(a){ return function(b){ return function(c){ console.log(a + b + c); } } } plusFunc(1)(2)(4); // 7
Then what are the differences between Curried and Non-curried?
non-curried : Function will be immediately executed even though parameters are not passed.
? Function definition : func(a, b, c)
? Function execution : func(a)
? Execution result : func(a, undefined, undefined)
curried : Execution will be suspended if parameters are not fully passed.
? Function definition : func(a, b, c)
? Function execution : func(a)
? Execution result : func(a) waits for b parameter.
So we can use currying as below.
function setAppell(appell){ return function(name) { console.log(appell + name); } } const setName = setAppell('Mr.'); setName('Right'); // Mr.Right setAppell('Mr.')('Baker'); //Mr.Baker //ES6 화살표 함수 const setAppell = appell => name => console.log(appell + name); const setName = setAppell('Miss.'); setName('Dior'); // Miss.Dior
If we use currying function, we can also pass event and value together.
const setNumber = (num) => (event) => { console.log(event.target.id+':'+num); } <div onClick="setNumber(2)(event)" id='myNum'> click </div> // myNum:2
What is Pros.
? Pros
– Reusable
– Reduced amount of code
– Readability
And Cons.
? Cons
– Deeply nested functions cause memory and speed issue. So Currying
Mathematical Explanations of Currying
Most of the functions can be implemented without using currying. but you can expect a good effect if you use currying to improve productivity through reusability or readability.