const go = (...args) => reduce((a, f) => f(a), args);
go(
0,
a => a + 1, //결과 값을 다음 함수의 인자로 전달해가며, 원하는 결과를 마지막에 얻는 함수
a => a + 10,
a => a + 100,
log
);
go(
products, //첫 배열
products => filter(p => p.price < 20000, products), //첫 연산
products => map(p => p.price, products), //filter의 반환 값을 인자로 받아 다시 연산
prices => reduce(add, prices), //이전 값을 받아 reduce로 가격을 모두 더해 축약
log //가격의 총합의 반환값을 console.log(인자) 로 싫행
)
함수들이 나열된 합성된 함수 자체를 만드는 함수
값을 이끌어내는 go와 달리 함수를 이끌어냄
함수를 리턴하는 함수
const pipe = (f, ...fs) => (..as) => go(f(...as), ...fs);
const f = pipe(
a => a + 1,
a => a + 10,
a => a + 100,
);
log(f(0)) // 결과는 111
const curry = f => (a, ..._) => _.length ? f(a, ..._) : (..._) => => f(a, ..._);
//함수를 받고 리턴 => 리턴된 함수 실행 => 인자가 2개 이상이면, 받아둔 함수를 실행, 2개 미만이면 함수를 다시 리턴해 그 이후 받은 인자들을 합쳐 실행
const mult = curry((a, b) => a * b);
log(mult(1)); //인자가 하나만 전달되었으므로 함수를 리턴함.
log(mult(1)(2)); //인자를 하나 받아 인자를 저장한 함수를 리턴했으므로, 그 이후 값을 다음 인자로 활용
const mult3 = mult(3); //첫 인자 3을 결정지은 함수 리턴
log(mult3(10)) //30
log(mult3(5)) // 15
log(mult3(3)) // 9
go(
products, //첫 배열
products => filter(p => p.price < 20000)(products), // products를 받아 products를 반환. 즉 축약이 가능
products => map(p => p.price, products),
prices => reduce(add, prices),
log
)
go(
products, //첫 배열
filter(p => p.price < 20000),
map(p => p.price),
reduce(add),
log
)
const total_price = pipe(
map(p => p.price),
reduce(add),
)
const base_total_price = predi => pipe(
filter(predi),
total_price);
)
go(
products,
base_total_price(p => p.price < 20000), //filter를 대체하는 동시에 total_price까지 함께 실행
log
)
go(
products,
filter(p => p.price < 20000),
total_price,
log
)