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