본문 바로가기

Javascript/함수형 프로그래밍

커링 (curry, curryr, get)

반응형

커링

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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(10);
console.log( add10(5) ); //15
console.log( add(5)(3) ); //8
// 결국 원형함수를 계속 가지고 있다가 원하는 시점에 평가하는 스타일


원형 함수를 가지고 있다가 원하는 시점에 평가하는 함수 => curry 함수


1
2
3
4
5
6
7
8
9
10
11
12
13
14
function _curry(fn){
  return function(a,b){
    return arguments.length ==2 ? fn(a,b) : function(b){return fn(a,b);};
  }
}
var add = _curry(function(a,b){
  return a+b;
});
 
var add10 = add(10);
console.log( add10(5) ); //15
console.log( add(5)(3) ); //8
 
console.log( add(1,2) ); // 위와 같이 고쳐서 이것도 나온다.


인자가 두개인 것으로 고쳐서 인자가 두개들어올 때는 바로 원형함수를 평가하는 스타일


1
2
3
4
5
6
7
8
9
10
11
12
13
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;
});
 
console.log(sub(10,5));
var sub10 = sub(10);
console.log( sub10(5) );


이렇게 sub 함수를 만들고 기존의 curry를 써버리면 마지막 13번째줄의 코드는 5 - 10이란 의미와는 다르게 10 - 5가 된다. 그래서 _curryr이라는 함수를 만들어서 오른쪽(r)부터 적용하게 만들었다.

이렇게하면 sub10(5)도 명확하게 5에서 10을 뺀 -5가 나오게 된다.


1
2
3
4
5
6
7
8
function _get(obj,key){
  return obj == null? undefined : obj[key];
}
var user1 = users[0];
console.log(user1.name);
console.log(_get(user1,'name'));
//console.log(users[10].name); 이거는 유저10이 없으니까 에러뜨지만
console.log(_get(users[10],'name'));// 이거는 undefined가 뜸 좀더 좋음
cs

_get함수를 만들면 조금 더 안전하게 사용 가능하다.

이걸 왜만들었는지는 아래에 예제에 있다.

1
2
3
4
5
6
7
8
var _get = _curryr(function(obj,key){
  return obj ==null? undefined : obj[key];
});
var get_name = _get('name');
console.log( get_name(user1) );
console.log( get_name(users[3]));
 
_map(_filter(users, function(user){return user.age >= 30;}), _get('name'));
cs

_get 함수를 만들어서 어떤 요소를 뽑을지를 정한다.

8번째줄에 기존의 _map, _filter함수에서 _get을 이용해 더 간략하게 줄었다.

반응형