[JS] 자바스크립트 함수형 프로그래밍(인프런) 정리 (STEP 51)

지연 평가

image

STEP 51

자바스크립트로 알아보는 함수형 프로그래밍 - 인프런 강의 강의를 보고 정리한 내용입니다.

지연 평가

1. 지연 평가 시작, 유지 함수

1-1) map

1-2) filter, reject

partial.js 라이브러리를 사용해야한다.

기존의 엄격 평가 예제

var mi = 0;
var fi = 0;
_.go(
  _.range(100), // 1~100 숫자 든 배열
  _.map(function (val) {
    ++mi;
    return val * val;
  }),
  _.filter(function (val) {
    ++fi;
    return val % 2;
  }),
  _.take(5), // 그 중 5개만 뽑음
  console.log
);

console.log(mi, fi); // 100, 100
  • map, filter 모두 100번씩 실행된다.

image

take 적용 후 실행 결과

image


위의 엄격 평가 예제에 지연 평가 적용 (L)

var mi = 0;
var fi = 0;
_.go(
  _.range(100),
  L.map(function (val) {
    ++mi;
    return val * val;
  }),
  L.filter(function (val) {
    ++fi;
    return val % 2;
  }),
  L.take(5),
  console.log
);

console.log(mi, fi); // 10, 10

image

  • 이전 예제와 달리 map, filter는 10번만 실행된다. 왜냐하면 지연 평가를 적용해 최적화되었기 때문이다. map이 다 실행되고 filter가 실행되는게 아니라 map에서 한 요소가 실행되고 filter로 넘어가 평가하고 true이면 take로 넘어가서 출력되는 과정을 거치기 때문에 배열을 모두 돌지 않고 결과적으로 필요한 만큼만 돌게된다.
  • 함수형 프로그래밍이고 함수형 프로그래밍은 순수함수를 이용하기 때문에 이러한 일이 가능한 것이다. 순수함수는 시점과 상관없이 항상 동일한 결과를 낸다.
var mi = 0;
var fi = 0;
_.go(
  _.range(100),
  L.map(function (val) {
    ++mi;
    return val * val;
  }),
  L.filter(function (val) {
    ++fi;
    return val % 2;
  }),
  L.some(function (val) {
    return val > 100;
  }),
  console.log
);

console.log(mi, fi); // 12, 12
  • some 관련 코드를 보면 100이 넘는 값이 하나라도 있으면 true를 리턴한다. 이처럼 some도 take처럼 지연 평가를 끝내는 함수에 속한다. 지연 평가가 적용된 상황에서는 map, filter의 보조함수가 100번 실행되지 않고 최적화 되어 필요한 만큼만 실행된다.

2. 지연 평가 끝내는 함수

2-1) take

2-2) some, every, find

Comment

팀원들 결과물

References

Categories:

Updated: