본문 바로가기
JavaScript

[FP&ES6+] L.map, L.filter

by _sweep 2021. 12. 25.

함수형 프로그래밍과 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

댓글