const go = (...args) => reduce((a, f) => f(a) , args) // a = 0 + 1 (값), f(a) = a + 10 (다음 실행 함수) ... 연속적으로 계속 실행됨
go (
0,
a => a + 1,
a => a + 10,
a => a + 100,
log)
// 인자를 다음 함수에게 전달하고, 이 함수의 결과를 다음 함수로 전달 ...
// reduce
//ex 2
go(
products,
products => filter(p => ~~~ , products),
products => map(p => ~~~ , products),
prices => reduce(add, prices),
log)
go
와 다르게 함수를 리턴하는 함수const pipe = (...fs) => (a) => go(a, ...fs)
// pipe 내부에 첫번째 인자로 함수가 있을 때 처리해주는 방법
const pipe = (f, ...fs) => (...as) => go(f(...as), ...fs)
const p = pipe(
(a, b) => a + b,
a => a + 10,
a => a + 100)
p(0, 1) // 111
curry
함수는 받아둔 함수를 원하는 시점에서 평가시키는 함수const curry = f =>
(a, ..._) => _.length ? f(a, ..._) : (..._) => f(a, ..._)
// 첫번째 인자(a) 와 나머지 인자(..._) 를 받음
// _.length > 0 ... 함수에 인자가 2개 이상 전달 되었을 때를 의미함
// 인자가 2개 이상이라면 받아둔 함수를 즉시 실행
// 아니라면 함수를 다시 리턴함 ... 그 후에 받은 인자를 합쳐서 함수를 실행
const mult = curry((a, b) => a * b)
log(mult(3)(2)) // 6
or
const mult = mult(3)
log(mult(10)) // 30
log(mult(5)) // 15
log(mult(3)) // 9
go(
products,
products => filter(p => ~~~ , products),
products => map(p => ~~~ , products),
prices => reduce(add, prices),
log)
위 함수를,
go(
products,
filter(p => ~~~),
map(p => ~~~),
reduce(add),
log)
로 표현할 수 있다.
go(
products,
filter(p => ~~~),
map(p => ~~~),
reduce(add),
log)
// 다른 함수에서 map 과 reduce 가 동일하게 사용된다면,
const total_price = pipe (
map(p => ~~~),
reduce(add))
go(
products,
filter(p => ~~~),
total_price,
log)
// 또 여기서 구조는 같지만 인자가 다른 함수의 경우에도 따로 빼낼 수 있다.
const base_total_price = predi => pipe(
filter(predi),
total_price)
go(
products,
base_total_price(p => ~~~),
log)
미뤄두었던 함수형 프로그래밍 강의를 다시 꺼내왔다.
조금은 이해가 가기 시작하는 것 같기도 하지만, 문제는 실제로 사용해보기에는 아직 힘들 것 같다.
로직의 입출력을 따라가보면서 공부하고있다.
보다보면 되겠징..