섹션2. 함수형으로 전환하기 - 3

리리·2021년 7월 22일

TIL

목록 보기
9/22

커링

_curry, _curryr

커링은 함수와 인자를 다루는 기법이다. 함수에 인자를 하나씩 적용해나가다가 필요한 인자가 다 모이면 함수 전체를 실행하는 기법이다.
커링이 직접적으로 지원되지 않지만, 일급함수가 지원되고, 평가시점을 마음대로 다룰 수 있기 때문에 사용할 수 있다.

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) );

_get만들어 조금 더 간단하게 하기

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') );

reduce 만들기

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

0개의 댓글