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