본문 바로가기

JavaScript27

[FP&ES6+] go, pipe, reduce에서 비동기 제어 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✅ go, pipe, reduce에서 비동기 제어 const go = (...args) => reduce((a, f) => f(a), args); const pipe = (f, ...fs) => (...as) => go(f(...as), ...fs); const reduce = curry((f, acc, iter) => { if (!iter) { iter = acc[Symbol.iterator](); acc = iter.next().value; } else iter = iter[Symbol.iterator](); let cur; while(!(cur = iter.next()).done) { const a = cur.value.. 2022. 1. 8.
[FP&ES6+] Klesli Composition 관점에서의 Promise 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✅ Klesli Composition 관점에서의 Promise Promise는 Klesli Composition을 지원하는 도구이다. Klesli Composition은 오류가 있을 수 있는 상황에서 함수 합성을 안전하게 하기 위한 하나의 규칙이다. 오류가 있을 수 있는 상황은 여러 가지가 있는데 들어오는 인자가 잘못된 값이라 함수에서 오류가 나는 상황과 정확한 인자가 들어왔더라도 함수가 의존하고 있는 외부의 상태에 따라 결과를 정확히 전달할 수 없는 상황이 대표적이다. Klesli Composition은 위와 같은 상황을 안전하게 해결하기 위해 존재한다. f(g(x)) = f(g(x)) f·g에 대해 수학적으로 위의 식은 .. 2022. 1. 5.
[FP&ES6+] 합성 관점에서의 Promise와 Monad 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✅ 합성 관점에서의 Promise 결론부터 이야기하자면 Promise는 비동기 상황에서 함수 합성을 안전하게 하기 위한 도구이자 모나드이다. 함수 합성이란 f · g을 말하며 g 함수를 먼저 적용한 결괏값에 f 함수를 적용하는 것이다. x라는 값이 있다고 할 때 f · g는 f(g(x))와 같다. 연속적으로 함수가 실행되고 함수 합성을 할 때 상황에 따라 안전하게 합성할 수 있게 하기 위해 모나드라는 개념이 필요하다. 그리고 그 구현체 중 비동기 상황을 안전하게 합성하기 위해 Promise를 사용한다. 즉, Promise는 모나드의 일종이다. ✅ Monad 모나드(Monad)는 값을 담는 컨테이너의 일종이며 Functor를 .. 2022. 1. 5.
[FP&ES6+] 일급 값으로의 Promise 활용 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✏️ 예제 const go1 = (a, f) => f(a); const add5 = (a) => a + 5; console.log(go1(10, add5)); // output // 15 go1 함수는 값과 함수를 인자로 받아 함수에 값을 적용한 결과를 단순 리턴하는 함수이다. go1 함수가 제대로 동작하려면 다음과 같은 전제 조건이 필요하다. 인자로 주어지는 함수 f가 동기적으로 동작해야 한다. 인자로 주어지는 값 a가 동기적으로 바로 값을 알 수 있는 값이어야 한다. 즉, go1 함수의 인자로 비동기 상황이 일어난 값이 아닌(Promise가 아닌) 값이 들어와야 정상적으로 원하는 결과를 얻을 수 있다. console.lo.. 2022. 1. 3.
[FP&ES6+] callback, Promise를 이용한 비동기 동시성 프로그래밍 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✅ callback을 이용한 비동기 동시성 프로그래밍 callback은 함수에 파라미터로 들어가는 함수이다. 코드를 순차적으로 실행하고 싶을 때 콜백 함수를 사용한다. 자바스크립트는 특성상 비동기적으로 처리되기 때문에 함수의 실행을 순차적으로 작성했다고 하더라도 이 함수들이 해당 순서대로 동작하는 것은 보장할 수 없다. 따라서 순서를 확실하게 보장하고 싶은 경우 먼저 실행할 함수에 다음 실행할 함수를 인자로 넣어 순차적으로 실행하게 하는 것이다. function add10(a, callback) { setTimeout(() => callback(a + 10), 100); } add10(5, (res) => { console... 2022. 1. 2.
[FP&ES6+] L.flatMap, flatMap 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✅ Array.prototype.flatMap과 flatten + map의 비교 Array.flatMap() 먼저 Array.map()을 사용해 각 요소에 대해 map 연산을 수행한 후 얻은 결과를 값을 펼쳐 새로운 배열로 만든다. arr.flatMap(callback(currentValue[, index[, array]])[, thisArg]) currentValue : 배열에서 처리되는 현재 엘리먼트 console.log([[1, 2], [3, 4], [5, 6, 7], 8].flatMap(a => a)); console.log([[1, 2], [3, 4], [5, 6, 7]].flatMap(a => a.map(a => .. 2021. 12. 28.
[FP&ES6+] L.flatten, flatten 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✅ L.flatten [[1, 2], 3, 4, [5, 6], [7, 8, 9]]와 같은 값이 들어왔을 때 결과값으로 [1, 2, 3, 4, 5, 6, 7, 8, 9] 와 같이 값을 펼친 결과를 리턴하는 함수이다. 다시 말해 위와 같은 값이 들어왔을 때 L.flatten을 사용하여 [...[1, 2], 3, 4, ...[5, 6], ...[7, 8, 9]] 처럼 동작하려 한다. 전개 연산자를 사용한 것과 같은 작업을 하기 위해서는 먼저 인자로 주어진 이터러블을 순회한다. 그러다 이터러블인 요소를 만나면 이들을 다 이터러블이 아닌 값이 될 때까지 값을 펼친다. const isIterable = (a) => a && a[Symb.. 2021. 12. 27.
[FP&ES6+] L.map, L.filter로 map, filter 만들기 함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다. ✅ L.map + take로 map 만들기 const map = curry((f, iter) => { let res = []; iter = iter[Symbol.iterator](); let cur; while (!(cur = iter.next()).done) { const a = cur.value; res.push(f(a)); } return res; }); L.map = curry(function* (f, iter) { iter = iter[Symbol.iterator](); let cur; while (!(cur = iter.next()).done) { const a = cur.value; yield f(a); } }).. 2021. 12. 27.
[FP&ES6+] 결과를 만드는 함수 - take 함수형 프로그래밍과 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.