커링은 함수와 인자를 다루는 기법이다. 함수에 인자를 하나씩 적용해나가다가 필요한 인자가 다 모이면 함수 전체를 실행하는 기법이다.
커링이 직접적으로 지원되지 않지만, 일급함수가 지원되고, 평가시점을 마음대로 다룰 수 있기 때문에 사용할 수 있다.
function _curry(fn) {
return function(a) {
return function(b) {
return fn(a, b);
}
}
}
아래처럼 만들 수 있다.
var add = _curry(function(a, b) {
return a + b;
});
console.log(add(10,5));
add = function(a) {
return function(b) {
return fn(a, b);
}
}
addmaker처럼 커링으로 작동된다.
var add10 = add(10); // 인자가 하나일 경우, 함수가 리턴된다.
var add5 = add(5);
console.log( add10(5) );
console.log( add(5)(3) );
console.log( add5(3) );
console.log( add(10)(3) );
console.log( add(1, 2) );
curry 함수를 이용해서 어떤 것을 가져오는지(반복되는 부분)을 함수로 만들어준다.
앞선 함수들과 마찬가지로 함수가 간략화되고, 함수 내부에서 명령하는 부분이 줄어든다.
var _get = _curryr(function(obj, key) {
return obj == null ? undefined : obj[key];
});
console.log(
_map(
_filter(users, function(user) { return user.age >= 30; }),
_get('name')));
console.log(
_map(
_filter(users, function(user) { return user.age < 30; }),
_get('age')));
아래와 같이 작동한다.
//var user1 = users[0];
//console.log(user1.name);
//console.log(_get(user1, 'name'));
//console.log(_get('name')(user1));
//
//var get_name = _get('name');
//
//console.log( get_name(user1) );
//console.log( get_name(users[3]) );
//console.log( get_name(users[4]) );
//console.log( users[10].name );
//console.log( _get(users[10], 'name') );
function _reduce(list, iter, memo) {
if (arguments.length == 2) {
memo = list[0];
list = _rest(list);
}
_each(list, function(val) {
memo = iter(memo, val);
});
return memo;
}
다음과 같이 사용한다.
console.log(
_reduce([1, 2, 3], add, 10));
// 16
console.log(
_reduce([1, 2, 3], add));
// 6
console.log(
_reduce([1, 2, 3, 4], add, 10));
// 20