curry

이재진·2020년 7월 28일
0

curry
curry는 필요한 인자를 모두 채울 때까지 인자를 적용해 나가다가 모든 인자의 개수가 채워지면 함수의 본체를 실행하는 기법이다.

function _curry(fn) {
  return function(a) {
    return function(b){
      return fn(a, b);
    }
  }
  
}

var add =  _curry(function(a, b) {
  return a + b ;
});

var add10 = add(5)

console.log( add10(5) ) // 10

console.log( add(5)(5)) // 10

console.log ( add(1, 3) ) 
// 이거의 결과는 그냥 실행이 안되고 함수 값만 리턴함
//function(b){
//    return fn(a, b);
//  }

인자가 2개 들어오면 함수를 리턴하지 않고 즉시 실행하는 것으로 만들면?

function _curry(fn) {
  return function(a, b) {
    if(arguments.length === 2) return fn(a, b);// 인자가 2개 들어오면 즉시 평가
    return function(b){ // 인자가 하나일경우 인자를 하나 더 받아 함수 실행을 미룬다.
      return fn(a, b);
    }
  }
  
}

console.log ( add(1, 3) )  //  결과 4로 잘 나온다.

이 코드는 둘다 결과를 리턴하기 때문에 삼항연산자로 만들면 코드가 더 간결 해진다.

function _curry(fn) {
  return function(a, b) {
    return arguments.length === 2 ? fn(a, b) : function(b){ return fn(a, b);}
  }
}

_curryr

curry와 같은 동작이나 인자를 오른쪽에서 부터 적용해 나가는 함수

function _curryr(fn) {
  return function(a, b) {
    return arguments.length === 2 ? fn(a, b) : function(b){ return fn(b, a);}
  }
}

var sub =  _curryr(function(a, b) {
  return a - b ;
});

var sub10 = sub(10)

console.log( sub10(5) ) // 5-10 = -5

console.log( sub(7)(5)) // 5 -7 = -2

console.log( sub(5, 10 )) // 5-10 = -5
profile
개발블로그

0개의 댓글