curry (커링)

joDMSoluth·2020년 3월 13일
0

함수형프로그래밍

목록 보기
14/17

커링 : 함수의 인자를 다루는 기법, 함수에 필요한 인자가 전부 채워지면 함수를 실행하는 기법

1-1. curry

function _curry(fn) {
  return function (a) {
    return function(b) {
      return fn(a, b);
    }
  }
}

var add = _curry(function(a, b) {
  return a + b;
});
// var add = function(a) {
// 	return function(b) {
//		return fn(a, b);
//	}
// }

var add10 = add(10);

console.log(add10(5));
console.log(add(5)(3));
// output : 15

1-2. curry 응용 (인자의 개수에 따라 달라지는 로직)

fucntion _curry(fn) {
  return function(a, b) {
    return arguments.length === 2 ? fn(a, b) : function(b) { return fn(a, b); };
  }
}

var sub = _curry(function(a, b) {
  return a - b
})
console.log(sub(10, 3)); // 인자가 2개일 때 바로
console.log(sub(5)(3)); // 인자 1개일 때
var sub10 = sub(10);
console.log(sub10(5));

1-3 _curryr

function _curryr(fn) {
  return function(a, b) {
    return arguments.length == 2 ? fn(a, b) : function(b) {return fn(b, a);};
  }
}
// 인자가 한개씩 들어올 경우는 fn(b, a) 처럼 오른쪽 부터 적용

var sub = _curryr(function(a, b) {
  return a - b;
});
console.log(sub(10, 5));
// output : 10 - 5

var sub10 = sub(10);
console.log(sub10(5));
// output : 5 - 10

2-1 _get 만들어 좀 더 간단하게 표현

_get : object와 key를 받아 object[key]를 반환

function _get(obj, key) {
  return obj === null ? undefined : obj[key];
}
var user1 = users[0];
console.log(user1.name); // 에러
console.log(_get(user1, 'name')); // undefined
var _get = _curryr(function(obj, key) {
  return obj === null ? undefined : obj[key];
});

var user1 = users[0];
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]);

// 복습하기
consle.log(
_map(
  _filter(users, function(user) {return user.age >= 30; }),
  function(user) { return user.name; }));

consle.log(
_map(
  _filter(users, function(user) {return user.age < 30; }),
  function(user) { return user.age; }));

// 위의 코드가
consle.log(
_map(
  _filter(users, function(user) {return user.age >= 30; }),
  _get('name')));

consle.log(
_map(
  _filter(users, function(user) {return user.age < 30; }),
  _get('age')));
// 로 간소화 가능
profile
풀스택이 되고 싶은 주니어 웹 개발자입니다.

0개의 댓글