Currying function 이란?
수학자 Haskell Curry 의 이름을 딴 함수입니다. 여러 개의 인자를 받는 함수를 단 하나의 인자만 받는 함수(unary) 로 만드는 과정을 커링(Currying) 이라고 합니다. 커링을 적용하려면, 여러 인자를 받는 함수(n-ary) 를 하나의 인자만 받는 함수 (unary) 로 변환해야 합니다.
커링 기본 개념 예제
const multiArgFunction = (a, b, c) => a + b + c;
console.log(multiArgFunction(1, 2, 3)); // 6
const curryUnaryFunction = (a) => (b) => (c) => a + b + c;
curryUnaryFunction(1); // returns a function: b => c => 1 + b + c
curryUnaryFunction(1)(2); // returns a function: c => 3 + c
curryUnaryFunction(1)(2)(3); // returns the number 6
고차함수를 이용해 기존에 작성된 함수를 커링하기
/**
* 2개의 인자를 가진 함수를 커링한다.
*/
function curry(f) {
return function (a) {
return function (b) {
return f(a, b);
};
};
}
function sum(a, b) {
return a + b;
}
const curriedSum = curry(sum);
console.log(curriedSum(10)(20)); // 30
어떤 구조로 위의 코드가 실행되는지 천천히 살펴보면, curry(sum) 의 결과인 curriedSum 은 처음에 대략 아래와 같은 형태를 가지게 됩니다.
function curriedSum(a) {
return function (b) {
return sum(a, b);
};
}
이후에 실행되는 curriedSum(10) 은 아래와 같은 형태를 가지게 됩니다.
function curriedSum10(b) {
return sum(10, b);
}
이후에 실행되는 curriedSum(10)(20) 은 아래와 같은 형태를 가지게 됩니다.
sum(10, 20);
위는 단적인 예이며, 커링을 잘 사용하면, 코드 재사용성과 함수적인 조합을 향상시켜줄 수 있습니다.
커링 활용하기
function log(date, importance, message) {
console.log(
`[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`
);
}
log(new Date(), "INFO", "HELLO"); // [9:48] [INFO] HELLO
여기 기본 로깅 함수가 있습니다. 로깅 함수를 사용하다보니 보통 시간을 넣는 곳에는 현재 시간만을 넣게 된다는 것을 깨달았습니다. 그리고 두번째 인자로는 INFO, DEBUG, ERROR 등의 한정적인 문자열만 온다는 것을 깨달았다면, 이럴 때 커링을 이용할 수 있습니다.
function curry(f) {
return function (a) {
return function (b) {
return function (c) {
return f(a, b, c);
};
};
};
}
const logNowInfo = curry(log)(new Date())("INFO");
const logNowError = curry(log)(new Date())("ERROR");
const logNowDebug = curry(log)(new Date())("DEBUG");
logNowInfo("HELLO INFO"); // [10:3] [INFO] HELLO INFO
logNowError("HELLO ERROR"); // [10:3] [ERROR] HELLO ERROR
logNowDebug("HELLO DEBUG"); // [10:3] [DEBUG] HELLO DEBUG
레퍼런스
https://ko.javascript.info/currying-partials
https://github.com/sudheerj/javascript-interview-questions#what-is-the-currying-function
'자바스크립트 > 인터뷰' 카테고리의 다른 글
| let 키워드를 var 와 비교하여 설명해보세요 (0) | 2023.01.18 |
|---|---|
| pure function (순수 함수) 란 무엇인가요? (0) | 2023.01.18 |
| unary function 이란 무엇인가요? (0) | 2023.01.17 |
| Higher Order Function (고차함수) 란 무엇인가요? (0) | 2023.01.13 |
| First Order Function (일차 함수) 란 무엇인가요? (0) | 2023.01.13 |