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 |