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 = 2 console.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 = 7 const res2 = isOdd(4); //dvd = 4 console.log(res1) // 1 console.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"]