저도 완벽하게 이해했다고 볼 수는 없지만, 정리해봤어요. 혹시 틀리신 부분 지적해주시면 감사합니다!
const filter = curry((f, iter) => {
let res = [];
for (const a of iter) {
if (f(a)) res.push(a);
}
return res;
});
filter 자체를 log해보면 ..
const anonymous = (a, ..._) => .length ? f(a, ..._) : (..._) => f(a, ..._)
이런 형태에요.
이를 filter에 맞게 풀어보면 ..
const filter = (a, ..._) => {
_.length ? (
const anonymous = (a, ..._) => {
let res = [];
for (const b of _) {
if (a(b)) res.push(b);
}
return res;
}
) : (
const anonymous = (a) => (..._) => {
let res = [];
for (const b of _) {
if (a(b)) res.push(b);
}
return res;
}
};
여기서 (p) => p.price < 20000)
가 a에 들어가면..
...
(a) => (..._) => {
let res = [];
for (const b of _) {
if (a(b)) res.push(b);
}
return res;
}
...
const anonymous = (..._) => {
let res = [];
for (const b of _) {
if ((b) => b.price < 20000) res.push(b);
}
return res;
}
이렇게 되는 거에요.
go 부분을 풀어보기 전에 reduce를 풀어보면 ..
const reduce = (a, ..._) => {
_.length ? (
// 여기서 acc에 ..._이 할당되고 iter는 undefined입니다.
const anonymous = (a, acc, iter) => {
if (!iter) {
iter = acc[Symbol.iterator]();
acc = iter.next().value;
}
for (const b of iter) {
acc = a(acc, b);
}
return acc;
}
) : (
const anonymous = (a) => (acc, iter) => {
if (!iter) {
iter = acc[Symbol.iterator]();
acc = iter.next().value;
}
for (const b of iter) {
acc = a(acc, b);
}
return acc;
}
)
}
go의 reduce는 ..
const go = (...args) => reduce((a, f) => f(a), args);
const go = (...args) => {
let iter = args[Symbol.iterator]();
let acc = iter.next().value;
for (const b of iter) {
acc = b(acc);
}
return acc;
}
종합했을 때, go(products, filter(p => p.price < 20000), log)
는 다음과 같습니다.
// args는 [products, filter(p => p.price < 20000), log]
const go = (...args) => {
// iter = [filter(p => p.price < 20000), log]
// acc = products
let iter = args[Symbol.iterator]();
let acc = iter.next().value;
// 원래 for문 자리지만, 2개 뿐이니까 나열할게요.
// for (const b of iter) {
// acc = b(acc);
// }
// 1. filter 평가 -> iter[0]
let res = [];
// for (const b of products) {
// if ((b) => b.price < 20000) res.push(b);
// }
if ((b = { name: "반팔티", price: 15000 }) => b.price < 20000) res.push(b);
if ((b = { name: "긴팔티", price: 20000 }) => b.price < 20000) res.push(b);
if ((b = { name: "핸드폰케이스", price: 15000 }) => b.price < 20000) res.push(b);
if ((b = { name: "후드티", price: 30000 }) => b.price < 20000) res.push(b);
if ((b = { name: "바지", price: 25000 }) => b.price < 20000) res.push(b);
// res = [15000, 15000];
// filter 끝의 return res와
// go의 for문에서 acc = b(acc);에 의해
acc = res;
// 2. log 수행 -> iter[1]
acc = log(acc); // console.log의 리턴은 undefined, 출력은 정상
return acc;
}
봐주셔서 감사합니다! 👏