320x100
320x100
커링
: 함수와 함께 사용할 수 있는 고급 기술
: 자바스크립트 뿐만 아니라 다른 언어에도 존재
: f(a, b, c) 처럼 단일 호출로 처리하는 함수는 f(a)(b)(c)와 같이 각각의 인수가 호출 가능한
프로세스로 호출된 후 병합하도록 변환 함
: 커링은 함수를 호출하지 않고 변환함
ction curry(f) { // 커링 변환을 하는 curry(f) 함수
return function(a) {
return function(b) {
return f(a, b);
};
};
}
// usage
function sum(a, b) {
return a + b;
}
let curriedSum = curry(sum);
alert( curriedSum(1)(2) ); // 3
: 실제 구현은 두 개의 래퍼를 사용한 것과 같음
- lodash 라이브러리의 _.curry()
function sum(a, b) {
return a + b;
}
let carriedSum = _.curry(sum); // lodash 라이브러리의 _.carry 사용
alert( carriedSum(1, 2) ); // 3, 보통 때 처럼 호출가능
alert( carriedSum(1)(2) ); // 3, partially 호출되었음
커링의 쓰임새
function log(date, importance, message) {
alert(`[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`);
}
// 커링을 적용
log = _.curry(log);
// 기존 함수는 정상적으로 작동
log(new Date(), "DEBUG", "some debug"); // log(a, b, c)
// 커링을 적용한 함수를 호출해도 정상 작동
log(new Date())("DEBUG")("some debug"); // log(a)(b)(c)
- 현재 시간으로 로그를 출력할 때
// logNow 는 log 의 첫 번째 인수가 고정된 partial이 될 것입니다.
let logNow = log(new Date());
// use it
logNow("INFO", "message"); // [HH:mm] INFO message
- 디버깅 로그를 편리하게
let debugNow = logNow("DEBUG");
debugNow("message"); // [HH:mm] DEBUG 메세지
=> partial 함수를 쉽게 작성할 수 있음
고급 커리 구현
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return function(...args2) {
return curried.apply(this, args.concat(args2));
}
}
};
}
function sum(a, b, c) {
return a + b + c;
}
let curriedSum = curry(sum);
alert( curriedSum(1, 2, 3) ); // 6, 보통때 처럼 단일 callable 형식으로 호출하기
alert( curriedSum(1)(2,3) ); // 6, 첫 번째 인수를 커링하기
alert( curriedSum(1)(2)(3) ); // 6, 모두 커링하기
- curry(func)의 반환 값은 아래 curried라는 래퍼와 같음
// func 이 변환되어야 하는 함수입니다
function curried(...args) {
if (args.length >= func.length) { // (1)
return func.apply(this, args);
} else {
return function pass(...args2) { // (2)
return curried.apply(this, args.concat(args2));
}
}
};
Refference
커링
ko.javascript.info
300x250
728x90
'Programming > JavaScript' 카테고리의 다른 글
모던 자바스크립트 16. BigInt (0) | 2022.04.23 |
---|---|
모던 자바스크립트 15. 참조 타입 (0) | 2022.04.23 |
모던 자바스크립트 13. Eval (문자열 코드 실행하기) (0) | 2022.04.23 |
모던 자바스크립트 (모듈) 12-3. 동적으로 모듈 가져오기 (0) | 2022.04.23 |
모던 자바스크립트 (모듈) 12-2. 모듈 내보내고 가져오기 (0) | 2022.04.23 |