We see what it means to curry a function, then walk through several examples of curried functions and their use cases.
For example we have an 'add' function:
const add = (x, y) => x + y;const inc = y => add(1, y); inc(2) //3
We want to conver it to using curry function, the way we do it is by function another function inside add function:
const add = x => y => x + y;
SO the first time we call add(), it will remember the value we passed in:
const inc = add(1); // now x = 1
But the function won't be run until we pass in second param:
const res = inc(2); // now y = 2console.log(res) // 3
----------
Of course, previous example is not that useful, there is another example:
const modulo = dvr => dvd => dvd % dvr;const isOdd = modulo(2); // dvr = 2;const res1 = isOdd(7); //dvd = 7const res2 = isOdd(4); //dvd = 4console.log(res1) // 1console.log(res2) // 0
Exmaple2:
const modulo = dvr => dvd => dvd % dvr;const isOdd = modulo(2); // dvr = 2;const filter = pred => ary => ary.filter(pred);const getAllOdds = filter(isOdd);const res = getAllOdds([1,2,3,4,5]);console.log(res) //[1, 3, 5]
Example3:
const replace = regex => replaceWith => str => str.replace(regex, replaceWith);const censor = replace(/[aeiou]/ig)('*'); // [aeiou] --> regex, replaceWith --> *const res = censor('Hello World');console.log(res); //"H*ll* W*rld"
Example 4:
const map = fn => ary => ary.map(fn);const replace = regex => replaceWith => str => str.replace(regex, replaceWith);const censor = replace(/[aeiou]/ig)('*'); // [aeiou] --> regex, replaceWith --> *const censorAll = map(censor);const res = censorAll(["Hello", "World"]);console.log(res); //["H*ll*", "W*rld"]