L.map으로 map 만들기 이터러블 객체를 순회하면서 일괄적으로 함수를 적용하는 map 함수를 지연평가를 적용한 L.map을 통해서 구현할 수 있다. 먼저 L.map의 코드는 아래와 같다. L.map = curry(function *(f, iter) { iter = iter[Symbol.iterator](); let cur; while (!(cur = iter.next()).done) { const a = cur.value; yield f(a); } }); 그리고 map 코드는 아래와 같다. const map = curry((f, iter) => { let res = []; iter = iter[Symbol.iterator](); let cur; while (!(cur = iter.next()).don..
인프런
앞선 강의 내용 L.entries = function *(obj) { for (const k in obj) yield [k, obj[k]]; }; const join = curry((sep = ',', iter) => reduce((a, b) => `${a}${sep}${b}`, iter)); const queryStr = pipe( L.entries, L.map(([k, v]) => `${k}=${v}`), join('&') ); console.log(queryStr({ limit: 10, offset: 10, type: 'notice' })); 앞서 배웠던 join 함수는 reduce 계열의 함수라고 볼 수 있다. 즉, reduce로 만들 수 있는 함수인 것이다. entries의 경우는 map을 통해..
이전 강의 내용 const queryStr = pipe( Object.entries, map(([k, v]) => `${k}=${v}`), reduce((a, b) => `${a}&${b}`) ); reduce를 보면 Array에 있는 join 함수와 같은 결과물을 반환한다. 그런데 Array의 join 메서드는 Array prototype에만 붙어있는 메서드다. 이때, reduce는 이터러블 객체를 순회하면서 값을 join하기에 조금 더 다형성이 높은 함수라고 볼 수 있다. Join 함수 const join = curry((sep = ',', iter) => reduce((a, b) => `${a}${sep}${b}`, iter)); const queryStr = pipe( Object.entries,..
reduce나 take는 하나의 결과를 만드는 함수이다. 이에 반해 map, filter는 배열이나 이터러블한 모나딕한 값에 원소들에게 함수들을 합성해 놓는 역할을 하고, reduce나 take는 원소들을 꺼내서 연산을 진행하기에, 최종적으로 결과를 만드는 함수다. map이나 filter 같은 함수는 지연성을 가질 수 있는 함수라고 볼 수 있고, reduce 같은 함수는 연산을 시작하는 시작점을 알리는 함수라고 볼 수 있다. map, filter를 반복하다가 reduce 같은 함수로 연산을 시켜서 함수를 종료하는 등으로 중간에 연산을 시작한다. 함수형으로 작업할 때, map이나 filter로 정제하다가 reduce로 값을 뽑아내도록 사고하는 것이 중요하다. map, filter, reduce로 함수 생성..