a(b,c(d,e()));
예제 코드는 함수가 연속으로 중첩되어 가독성이 떨어진다. 또한 작성, 해석하기 힘듬
더 읽기 쉽게 코드를 작성하기 위해 go, pipe 함수를 활용하자
인자를 전달받아 결과를 바로 산출하는 함수,
첫번째 인자는 시작되는 값을 받고, 나머지 함수를 받아 순서대로 결과를 만듬
reduce
를 사용하여 쉽게 구현이 가능 // reduce 함수구현
const reduce = (f, acc, iter) => {
if (!iter) {
iter = acc[Symbol.iterator]();
acc = iter.next().value;
}
for (const a of iter) {
acc = f(acc, a);
}
return acc;
};
// go 함수구현
const go = (...args) => reduce((a, f) => f(a), args);
go(0,
a => a + 1,
a => a + 10,
a => a + 100,
console.log);
// 111
const add = (a , b) => a + b;
go(add(0, 1),
a => a + 10,
a => a + 100,
console.log);
// 111
const products = [
{ name: '반팔티', price: 15000 },
{ name: '긴팔티', price: 20000 },
{ name: '핸드폰케이스', price: 15000 },
{ name: '후드티', price: 30000 },
{ name: '바지', price: 25000 },
];
const add = (a, b) => a + b;
console.log(
reduce(
add,
map(p => p.price,
filter(p => p.price < 20000, products))
)
); // 30000
// 순차적으로 실행하며 읽기 좋은 코드
go(
products,
products => filter(p => p.price < 20000, products),
products => map(p => p.price, products),
prices => reduce(add, prices),
console.log
); // 30000
함수를 리턴하는 함수
인자로 함수를 받아 그 함수들을 합성하여 하나의 함수를 리턴함
// pipe 함수구현
// 내부에서 go를 사용함
const pipe = (f, ...fs) => (...as) => go(f(...as), ...fs);
const f = pipe(
a => a + 1,
a => a + 10,
a => a + 100
);
const f = pipe(
(a, b) => a + b,
a => a + 10,
a => a + 100
);
console.log(f(0, 1)); // 111
// pipe 함수들을 인자로 전달받음
pipe = (...fs) => {};
// 함수를 리턴
pipe = (...fs) => () => {};
// arg는 pipe 함수가 실행되어 함축된 함수 -> 함수의 매개 변수
pipe = (...fs) => arg => {};
// 함수 함축을 위해 pipe 인자로 들어온 함수들을 reduce 처리
// reduce를 시작으로 arg를 전달
pipe = (...fs) => arg => fs.reduce(() => {}, arg);
// reduce 실행 시 a가 pipe 함수의 실행 결과인 함수의 인자 값이 들어감
// 그 이후 실행 결과 값이 a 되어 누산처리
pipe = (...fs) => arg => fs.reduce((a, f) => f(a), arg);
차이점
- go 함수는 인자로 받은 함수들을 모두 실행시켜 결과에 해당값을 리턴
- pipe 함수는 인자로 받은 함수를 모두 합쳐 합성된 함수를 리턴