인프런 유인동님의 '함수형 프로그래밍과 JavaScript ES6+' 강의를 들으며 정리 및 공부한 내용입니다.
go([0,
a => a + 1,
a => a + 10,
a => a + 100,
log);
=> 먼저 해당 함수를 만들어보자..
=> 가장 먼저 인자의 갯수가 정해져있지 않다.
=> 앞에서 배운 next()를 활용해야하는 것 같음
=> 들어오는 인자가 함수. 이건 문제될거 없을듯
=> 결국 인자들을 iterable하게 묶어주는 수단이 필요할거 같은데
=> 가장 큰 문제는 인자의 갯수가 정해져 있지 않은 것과 인자를 하나로 묶거나 그런게 없는점
=> 만약 배열이라면 destructuring으로 가져올수 있을 것 같은데 ..
=> 인자도 destructuring로 가져올 수 있음
=> iterator protocol을 사용하지 않고 일단 typeof로 하드코딩. ..
const go = (...iter) => {
let res;
for (let b of iter) {
if (typeof b === "function") {
res = b(res);
} else {
res = b;
}
}
};
go(
0,
(a) => a + 1,
(a) => a + 10,
console.log
);
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;
};
const go = (...args) => reduce((a, f) => f(a), args);
go(
0,
(a) => a + 1,
(a) => a + 10,
console.log
);
=> 공부하면서 만들었던 reduce를 활용하면 간단하게 보조함수를 적용할 수 있다.
=> 여기서 굉장히 헷갈린게 reduce 함수 안에 여섯번째 코드 라인인
acc = f(acc, a)
이 코드에서 f 의 정체를 모르겠었다.
그리고 고민 중에 강의 내에 나와 같은 고민을 한 분의 질문을 찾았고
답을 찾을 수 있었는데 기존에 array의 내장 함수 reduce의 동작을 생각해서 헷갈리는거였다.
이 reduce는 위에 우리가 직접 만든 함수로 첫번째 인자로 함수, 두번째 인자로 등등이 들어간다.
그러므로 reduce안의 (a, f) => f(a)는 인자로 들어가는 함수일 뿐.