Javascript
함수형 코딩 입문 / curryr이 코드를 쉽게 만드는 방법
변기원
2023. 7. 2. 14:15
강의를 처음 봤을 때는 curryr을 이해하지 못해서 curryr이 굳이 왜 필요하지?라는 생각을 했었는데
함수형 코드를 엄청 쉽게 만들어준다. 가독성이 좋아진다
강의는 인프런 유인동님의 '자바스크립트로 알아보는 함수형 프로그래밍 (ES5)'입니다.
커링이란 다중 인수를 갖는 함수를 단일 인수를 갖는 함수들의 함수열로 바꾸는 것을 말한다.
함수는 클로저를 반환하는 함수로서 함수의 평가시점을 뒤로 미루는 효과가 있다.
모든 인수를 전달받을때까지 클로저만 반환한다. 마지막 인수를 전달받으면 평가되어 값이 된다.
function _curry(fn) {
return function (a, b) {
return arguments.length === 2
? fn(a, b)
: function (b) {
return fn(a, b);
};
};
}
커링이 적용된 함수를 호출하면 첫 번째 전달받은 a변수를 기억하는 클로저를 반환한다.
curryr은 반대로 두번째(뒤)에 받은 인수를 먼저 전달하고 첫 번째 인수를 받으면 평가된다.
function _curryr(fn) {
return function (a, b) {
return arguments.length === 2
? fn(a, b)
: function (b) {
return fn(b, a);
};
};
}
이게 왜 필요할까? 강의 뒤쪽에 curryr을 이용해서 코드를 개선하는 것을 보면 이해된다.
_go(
users,
function (users) {
return _filter(users, function (user) {
return user.age >= 30;
});
},
function (users) {
return _map(users, function (user) {
return user.name;
});
},
console.log
);
_go 파이프라인을 통해 전달된 함수들을 바로바로 실행한다.
users 데이터를 전달하면
users를 받아서 age가 30이상인 유저를 반환하고
두 번째 함수는 users를 받아서 name으로 이루어진 배열을 반환한다.
(users) => _filter(users, (user) => user.age >= 30);
// _filter에 curryr이 적용되면 인수의 순서를 바꿀수 있다.
(users) => _filter((user) => user.age >= 30)(users);
// (a)=>console.log(a)는 console.log 로 표현할 수 있다.
// 그렇다면 위 함수도 아래와 같이 표현할 수 있다.
_filter((user) => user.age >= 30)
(users) => _map(users, (user) => user.name);
// _map에 curryr이 적용되면 인수의 순서를 바꿀수 있다
(users) => _map((user) => user.name)(users);
// (a)=>console.log(a)는 console.log 로 표현할 수 있다.
// 그렇다면 위 함수도 아래와 같이 표현할 수 있다.
_map((user) => user.name)
위 코드를 이해하고 적용해 보면
_go(users, _filter(getOlder), _map(_get('name')), console.log);
이렇게 개선할 수 있다.