์ปค๋ง Currying ๊ณผ ํด๋ก์
๐ ํด๋ก์ ๊ฐ๋จ ๋ณต์ต
ํด๋ก์ ๋,
ํ์ฌ์ ์ ํจ๋ฒ์๋ฅผ ๋์ด ์ค์ฝํ ์ฒด์ธ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๊ฒ ํด์ค๋ค.
๊ฐ๋จํ๊ฒ๋ "ํจ์์ ํจ์๊ฐ ์ ์ธ๋ ์ดํ์ ํ๊ฒฝ์ ์กฐํฉ" ์ผ๋ก ์ ์๋๋ค.
โ ์ฅ์
• ํจ์ ๋ด์ ์๋ ๋ณ์๋ฅผ ์ฌํ์ฉํ ์ ์๋ค.
• ์ฐธ์กฐํ๊ณ ์๋ ๋ณ์๋ฅผ ์ธ๋ถ์ ๋ ธ์ถ์ํค์ง ์์ ์ ์๋ค. ์๋ ๊ฐ๋ฅ
โ ๋จ์
• ํด๋ก์ ํจ์๋ฅผ ๋จ๋ฐํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ค.
๐ ์ปค๋ง์ ๊ณต๋ถํ๊ฒ ๋ ๊ณ๊ธฐ
์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ ์์ฐ์ค์ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฑด ์๋ค.
ํ์ง๋ง ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋๋ ์ง๋ฌธ์๋ ์์ ์๊ฒ ๋๋ต์ ๋ชปํ๊ฒ ๋๋ผ .. ใ
๊ทธ๋์ ์ค์ ํด๋ก์ ์์๋ฅผ ์ฐพ์๋ณด๊ฒ ๋์๋ค !-!
๐ ์ปค๋ง Currying
์ปค๋ง์ f(a, b, c) ์ฒ๋ผ ๋จ์ผ ํธ์ถ๋ก ์ฒ๋ฆฌํ๋ ํจ์๋ฅผ
f(a)(b)(c) ์ ๊ฐ์ด ๊ฐ๊ฐ์ ์ธ์๊ฐ ํธ์ถ ๊ฐ๋ฅํ ํ๋ก์ธ์ค๋ก ๋ณํํ๋ ๊ฒ์ด๋ค.
์ปค๋ง์ ํจ์๋ฅผ ํธ์ถํ์ง ์๋๋ค. ๋จ์ง ๋ณํํ ๋ฟ์ด๋ค.
// ์ปค๋ง ๋ณํ์ ํ๋ curry(f) ํจ์
function curry(f){
return function(a){
return function(b){
return f(a, b);
};
};
}
// ์ค์ ํจ์
function sum(a, b){
return a + b;
}
let curriedSum = curry(sum); // ํจ์ ๋ณํ !
console.log( curriedSum(1)(2) ) // 3
๊ทผ๋ฐ ๊ทธ๋์ ์ด๊ฑฐ ์ ์ด๋ค๊ณ ..?
๊ตณ์ด ์ด๋ ๊ฒ ์ธ์ ๋๋ ๊ฐ๋ฉด์ ๊น์ง ์ปค๋ง์ ์จ์ผํ๋ ์ถ์.
๐ ์ค์ (์ปค๋ง์ ์ฐ๋ฉด ํธ๋ฆฌํ) ์์
// ์ ๋ณด๋ฅผ ํ์ํํ๊ณ ์ถ๋ ฅํ๋ ๋ก๊ทธ ํจ์ log(date, importance, message) ๊ฐ์
// ์ค์ ํ๋ก์ ํธ์์ ์ด๋ฐ ํจ์๋ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ก๊ทธ๋ฅผ ๋ณด๋ด๋ ๊ฒ๊ณผ ๊ฐ์ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ ๊ณต!-!
// (lodash์ curryingํจ์์ ๋์์ ๋ฐ์ ๊ตฌํ)
import _ from 'lodash';
function log(date, importance, message){
alert(`[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`);
}
let log = _.curry(log);
log(new Date(), "DEBUG", "some debug"); // log(a, b, c);
log(new Date())("DEBUG")("some debug"); // log(a)(b)(c);
// partially ์ ์ฉ๋ ํจ์ === partial ํจ์
// ex. 01 ํ์ฌ ์๊ฐ์ผ๋ก๋ง ์ถ๋ ฅํ๋ log ํจ์
// logNow๋ log์ ์ฒซ ๋ฒ์งธ ์ธ์๊ฐ ๊ณ ์ ๋ partial์ด ๋๋ค.
let logNow = log(new Date());
logNow("INFO", "message"); // [HH:mm] INFO message
// ex. 02 ๋๋ฒ๊น
๋ก๊ทธ๋ฅผ ํธ๋ฆฌํ๊ฒ ํ๋ ํจ์
let debugNow = logNow("DEBUG");
debugNow("message"); // [HH:mm] DEBUG ๋ฉ์ธ์ง
// -> ์ปค๋ง, ์ด๋ ๊ฒ ํ์ฉํ ์ ์๋ค ๐๐๐ป
์ ... ์ด๋ ๊ฒ ๋ฐ๋ณต์ ์ผ๋ก ํ์ํ ์์๋ฅผ ์ค๋ณต์ ์ผ๋ก ์ ์ธํ์ง ์๊ณ ํ์ฉํ ์ ์๋ ๊ฒ ์ปค๋ง์ด๊ตฌ๋ !! ์ถ๋ค
ํด๋ก์ ์ ์ฅ์ ๊ณผ๋ ๋ถํฉํ๋ ใ ใ ์ค ์ ๊ธฐ ... ๐ฎ๐ฎ๐ฎ
๐ (์ฐธ๊ณ ํด๋๋ฉด ์ข์) ๋ค์ค ์ธ์๋ฅผ ํ์ฉํ๋ ์ปค๋ง ํจ์
function curry(func){
return function curried(...args1){
if(args1.length >= func.length){
return func.apply(this, args1);
} else {
return function(...args2){
return curried.apply(this, args.concat(args2));
}
}
};
}
function sum(a, b, c){
return a + b + c;
}
let curriedSum = curry(sum);
console.log( curriedSum(1, 2, 3) ); // 6 ๋จ์ผ callable ํ์์ผ๋ก ํธ์ถ
console.log( curriedSum(1)(2, 3) ); // 6 ์ฒซ ๋ฒ์งธ ์ธ์๋ง ์ปค๋ง
console.log( curriedSum(1)(2)(3) ); // 6 ์ธ์ ๋ชจ๋ ์ปค๋ง