본문 바로가기

functional programming21

[FP&ES6+] 결과를 만드는 함수 - reduce 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✅ 결과를 만드는 함수 map과 filter는 이터러블 안쪽의 값을 꺼내서 기본적인 값을 유지한 채로 새로운 값을 만든다. 반대로 reduce와 take는 이터러블 안쪽의 값을 꺼내는 것은 동일하나 값을 유지시키는 것이 아닌 연산이나 특정 방식으로 값을 깨뜨려 그 결과가 합쳐진 새로운 값을 만들어낸다. 즉, 결과를 만들어 낸다. const reduce = curry((f, acc, iter) => { if (!iter) { iter = acc[Symbol.iterator](); acc = iter.next().value; } for (const a of iter) { acc = f(acc, a); } return acc; }.. 2021. 12. 27.
[FP&ES6+] 즉시 평가와 지연 평가의 비교 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✅ 즉시 평가와 지연 평가의 중첩 사용 비교 즉시 평가를 사용하는 range, map, filter, take와 지연 평가를 사용하는 L.range, L.map, L.filter, take의 중첩 사용을 비교해 보고자 한다. range, map, filter, take의 중첩 사용 go( range(10), map(n => n + 10), filter(n => n % 2), take(2), console.log ); // output // [11, 13] go문 안에서의 실행 순서는 range, map, filter, take 순이다. 한 단계가 완료되면 다음 순서로 평가된 값을 넘기며 단계별로 실행된다. L.range, L.. 2021. 12. 25.
[FP&ES6+] L.map, L.filter 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✅ 이터러블 중심 프로그래밍에서의 지연 평가 Lazy Evaluation. 제때 계산법, 느긋한 계산법이라고도 한다. 제너레이터 / 이터레이터 프로토콜을 기반으로 구현하며 가장 필요할 때까지 평가를 미루다가 정말 필요할 때 코드들을 평가하며 값을 만들어 나간다. 쉽게 말하면, 평가를 미루는 성질을 가지고 평가 순서를 달리 조작할 수 있는 준비가 되어있는 이터레이터를 반환하는 제너레이터 함수이다. next()를 통해 평가하는 만큼의 값만 가져올 수 있다. ✅ L.map const L = {}; L.map = function* (f, iter) { for (const a of iter) yield f(a); } L.map은 제너.. 2021. 12. 25.
[FP&ES6+] take 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✅ take const take = (limit, iter) => { let res = []; for (const a of iter) { res.push(a); if (res.length == limit) return res; } return res; } limit값과 이터러블을 인자로 받는 함수이다. take 함수에서는 이터러블을 순회하다 이터러블의 limit번째 까지만 담아 리턴한다. 즉, 많은 값을 받아서 일정한 값 만큼 잘라주는 함수라고 할 수 있다. console.log(take(2, [1, 2, 3])); // output // [1, 2] ✅ 지연 평가의 효율성 L.range와 같이 지연성을 가지는 값을 이터레이.. 2021. 12. 25.
[FP&ES6+] range & L.range 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✅ range const range = length => { let i = -1; let res = []; while (++i a + b; var list = range(4); console.log(reduce(add, list)); // output // [0, 1, 2, 3, 4] // 6 숫자를 인자로 받아 0부터 그 숫자까지의 값을 요소로 가지고 있는 배열을 리턴한다. 함수의 내부를 살피면 length라는 인자를 받고 i가 0부터 length의 값까지 while문을.. 2021. 12. 22.
[FP&ES6+] go, pipe, curry - (3) 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✏️ 예제 const fruits = [ { name: '사과', price: 1000, quantity: 1 }, { name: '바나나', price: 2000, quantity: 2 }, { name: '딸기', price: 1500, quantity: 3 }, { name: '레몬', price: 1000, quantity: 4 }, { name: '복숭아', price: 3000, quantity: 5 } ]; const go = (...args) => reduce((a, f) => f(a), args); const pipe = (f, ...fs) => (...as) => go(f(...as), ...fs); con.. 2021. 12. 11.
[FP&ES6+] go, pipe, curry - (2) 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✅ curry const curry = f => (a, ..._) => _.length ? f(a, ..._) : (..._) => f(a, ..._); 함수를 값으로 다루면서 받아둔 함수를 원하는 시점(= 원하는 개수의 인자가 들어왔을 때)에 평가시킨다. 함수(f)를 받아 함수 ((a, ..._) => _.length ? f(a, ..._) : (..._) => f(a, ..._))를 리턴한다. 리턴된 함수 ((a, ..._) => _.length ? f(a, ..._) : (..._) => f(a, ..._))가 실행되었을 때 인자가 2개 이상이라면 받아둔 함수를 즉시 실행한다. 인자가 2개 이상이 아니라면 함수 (..... 2021. 12. 10.
[FP&ES6+] go, pipe, curry - (1) 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. *** 코드를 값으로 다루기 => 평가하는 시점을 원하는 대로 다룰 수 있다. ✅ go const go = (...args) => reduce((a, f) => f(a), args) 인자들을 받아 하나의 값으로 축약해 나가는 함수이다. go( 0, a => a + 1, a => a + 10, a => a + 100, console.log ); // output // 111 위와 같이 쓰게 된다면 args는 순서대로 0, f, f, f, f가 들어간다. 따라서 0이 a => a + 1의 인자로 들어가 1이라는 값이 되고 이 값이 a => a + 10의 인자로 들어가 11이라는 값이 되고 또 이 값이 a => a + 100의 인.. 2021. 12. 10.
[FP&ES6+] map, filter, reduce 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. *** 함수형 프로그래밍에서는 함수가 인자와 리턴 값을 통해 소통하는 방식을 권장한다. ✅ map const map = (f, iter) => { let res = []; for(const a of iter) { res.push(f(a)) } return res; } map 함수는 함수와 이터러블/이터레이터 프로토콜을 따르는 값을 인자로 받는다. 이후 이 값을 순회하며 함수에 따라 처리한다. 즉, 값을 처리하는 방식을 추상화하여 함수를 통해 어떤 값을 어떻게 처리할 것인지를 정한다. const fruits = [ { name: '사과', price: '1000' }, { name: '바나나', price: '2000' }, .. 2021. 12. 1.