[Functional Programming] 부록: 지연 평가 사용 사례
2025. 4. 26. 08:00ㆍ프로그래밍 공부/javascript & typescript
반응형
SMALL
함수형 프로그래밍의 핵심 개념 중 하나는 지연 평가(Lazy Evaluation) 이다.
데이터를 즉시 계산하지 않고, 필요할 때 평가(evaluation)하는 전략이다.
1. 지연 평가는 왜 필요한가
- 메모리 효율 형상
- 성능 최적화
- 무한 데이터 스트림 안전하게 가능
- 조건에 따라 조기 중단 가능(
take(n)
,find(item)
)
2. Javascript에서 지연 평가
JS에서는 Array.map, Array.filter는 즉시 평가(eager evaluation)이다.
[1, 2, 3, 4]
.filter(x => x % 2 === 0) // → 즉시 실행
.map(x => x * 10); // → 즉시 실행
3. 지연평가 이용 사례
3.1. 무한 숫자 스트림에서 100번째 짝수 찾기
function* infiniteNumbers() {
let i = 0;
while (true) yield i++;
}
function findNthEven(n: number): number {
let count = 0;
for (const x of infiniteNumbers()) {
if (x % 2 === 0 && ++count === n) return x;
}
}
console.log(findNthEven(100)); // → 198
3.2. 대용량 CSV 스트림 파싱
function* readCSVMock(): Generator<string> {
for (let i = 0; i < 1_000_000; i++) {
yield `row${i},value${i}`;
}
}
function* parseCSV(lines: Iterable<string>) {
for (const line of lines) yield line.split(",");
}
for (const [row, value] of parseCSV(readCSVMock())) {
if (row === "row5000") {
console.log("find!", value);
break;
}
}
3.3. 비동기 API 스트림에서 필요한 데이터만 추출
// async generator
async function* fetchUsers() {
for (let i = 0; i < 1_000_000; i++) {
yield await fetch(`/user/${i}`);
}
}
for await (const user of fetchUsers()) {
if (user.active) {
console.log("첫 번째 활성 유저:", user);
break;
}
}
4. Fx
로 선언적 프로그래밍하기
Fx.of(range(0, 1_000_000))
.filter(x => x % 2 === 0)
.map(x => x * 2)
.take(5)
.toArray(); // [0, 4, 8, 12, 16]
take(5)
로 인해 앞에서부터 5개만 평가되며filter
와map
은 지연평가된다.- 중간 연산자들은 순수하고 선언적
toArray()
를 호출해야 실제 평가가 발생
반응형
LIST
'프로그래밍 공부 > javascript & typescript' 카테고리의 다른 글
[Functional Programming] 4장: 고급 이터러블 함수 구현 (0) | 2025.04.24 |
---|---|
[Functional Programming] 3장: group 함수와 Fx 클래스 분리 (0) | 2025.04.23 |
[Functional Programming] 2장: iterator 함수 range 구현하기 (0) | 2025.04.21 |
[Functional Programming] 부록: 테스트 커버리지와 GitHub Workflows (0) | 2025.04.20 |
[Functional Programming] 1장: 기본 배열 함수 구현하기 (0) | 2025.04.19 |