반응형
커링
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을 이용해 더 간략하게 줄었다.
반응형
'Javascript > 함수형 프로그래밍' 카테고리의 다른 글
함수형 프로그래밍의 장점, 다형성!(어떤 객체에만 적용가능한 메서드가 아닌 함수를 생성한다) (0) | 2017.09.20 |
---|---|
each 메서드 만들어보기 (0) | 2017.08.29 |
함수형 프로그래밍으로 map, filter를 만들어보자(함수를 인자로 쓰기) (0) | 2017.08.26 |
일급 함수란? (함수를 객체처럼 다룬다, 일급 객체(first-class)) (0) | 2017.08.24 |
순수 함수란? (함수형 프로그래밍의 뿌리, 함수의 부수효과를 없앤다) (4) | 2017.08.23 |