앞선 강의 내용 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로 함수 생성..
map, filter 결합법칙 특정한 방식으로 다르게 평가 순서를 바꿔도 똑같은 결과를 만든다는 결합 법칙을 가진다. 사용하는 데이터가 무엇이든지, 사용하는 보조 함수가 순수 함수라면 무엇이든지 아래와 같이 결합한다면 둘 다 결과가 같게 출력된다. [[mapping, mapping], [filtering, filtering], [mapping, mapping]] = [[mapping, filtering, mapping], [mapping, filtering, mapping]] 즉시 평가하지 않고 지연 평가를 하기 때문에, mapping -> filtering -> mapping의 과정은 동일하게 처리되게 된다. 가로로 계산을 진행하는 것이나, 세로로 하나하나 함수를 거치는 것이나 동일하게 처리된다. 지연..