[Functional Programming] 부록: 지연 평가 사용 사례

2025. 4. 26. 08:00프로그래밍 공부/javascript & typescript

반응형
SMALL

함수형 프로그래밍의 핵심 개념 중 하나는 지연 평가(Lazy Evaluation) 이다.
데이터를 즉시 계산하지 않고, 필요할 때 평가(evaluation)하는 전략이다.

1. 지연 평가는 왜 필요한가

  1. 메모리 효율 형상
  2. 성능 최적화
  3. 무한 데이터 스트림 안전하게 가능
  4. 조건에 따라 조기 중단 가능(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개만 평가되며 filtermap은 지연평가된다.
  • 중간 연산자들은 순수하고 선언적
  • toArray()를 호출해야 실제 평가가 발생
반응형
LIST