함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다.
✅ 이터러블 중심 프로그래밍에서의 지연 평가
Lazy Evaluation.
제때 계산법, 느긋한 계산법이라고도 한다.
제너레이터 / 이터레이터 프로토콜을 기반으로 구현하며 가장 필요할 때까지 평가를 미루다가 정말 필요할 때 코드들을 평가하며 값을 만들어 나간다.
쉽게 말하면, 평가를 미루는 성질을 가지고 평가 순서를 달리 조작할 수 있는 준비가 되어있는 이터레이터를 반환하는 제너레이터 함수이다.
next()를 통해 평가하는 만큼의 값만 가져올 수 있다.
✅ L.map
const L = {};
L.map = function* (f, iter) {
for (const a of iter) yield f(a);
}
L.map은 제너레이터 함수이다.
함수와 이터러블을 인자로 받아 이터러블을 순회하며 함수를 적용한 결과값을 이터레이터로 반환한다.
var it = L.map(a => a + 10, [1, 2, 3]);
console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());
// output
// {value: 11, done: false}
// {value: 12, done: false}
// {value: 13, done: false}
// {value: undefined, done: true}
next()를 통해 값을 평가하며 a => a + 10이라는 함수를 거쳐 평가된 값을 가져온다.
var it = L.map(a => a + 10, [1, 2, 3]);
console.log([...it]);
// output
// [11, 12, 13]
이터러블 프로토콜을 따르기 때문에 전개연산자로 평가된 값을 가져올 수 있다.
✅ L.filter
L.filter = function* (f, iter) {
for (const a of iter) {
if (f(a)) yield a;
}
}
L.filter도 제너레이터 함수이다.
함수와 이터러블을 인자로 받으며 함수의 결과값이 참인 요소들을 반환한다.
이또한 next()를 통해 평가하는 만큼의 값만 가져올 수 있다.
var it2 = L.filter(a => a % 2, [1, 2, 3, 4]);
console.log(it2.next());
console.log(it2.next());
console.log(it2.next());
// output
// {value: 1, done: false}
// {value: 3, done: false}
// {value: undefined, done: true}
next()를 통해 값을 평가하며 a => a % 2라는 함수를 거쳐 평가된 값이 참인 요소를 가져온다.
var it2 = L.filter(a => a % 2, [1, 2, 3, 4]);
console.log([...it2]);
// output
// [1, 3]
L.map과 마찬가지로 이터러블 프로토콜을 따르기 때문에 전개연산자로 평가된 값을 가져올 수 있다.
'JavaScript' 카테고리의 다른 글
[FP&ES6+] 결과를 만드는 함수 - reduce (0) | 2021.12.27 |
---|---|
[FP&ES6+] 즉시 평가와 지연 평가의 비교 (0) | 2021.12.25 |
[FP&ES6+] take (0) | 2021.12.25 |
[FP&ES6+] range & L.range (0) | 2021.12.22 |
[FP&ES6+] go, pipe, curry - (3) (0) | 2021.12.11 |
댓글