함수형 프로그래밍 - Lazy

김동하·2022년 3월 19일
0

함수형프로그래밍

목록 보기
1/4

제너레이터

  • 제너레이터는 자바스크립트 문법 중 하나
  • 일반 함수와 달리 실행할 때만 값을 하나씩 yield함
function* generator(){
  yield 1;
  yield 2;
  yield 3;
}

let iterator = generator()
iterator.next() // { value:1, done:false}
iterator.next() // { value:2, done:false}

range

  • range는 정해진 수만큼 배열을 생성 number[]
// range

const range = () => {
   let i = -1;
   let res = [];
   while (++i < l) {
     res.push(i);
   }
   return res;
}

L.range

  • 여기에 Lazy 기능을 추가
  • Lazy는 제너레이터를 이용하여 함수를 실행하는 것
// L.lange

const L = {
  range = function*() {
   let i = -1;
   while(++i < l){
      yield i;
    }
  }
}

take

  • take는 정해진 수만큼 요소를 출력 (slice 느낌으로다가)
cosnt take = (l, iter) => {
    let res = [];
    for (const a of iter) {
      res.push(a);
      if (res.length === l) {
        return res;
      }
    }
    return res;
  },

테스트

const test = (name, f) => {
  console.time(name)
  f()
  console.timeEnd(name)
}

  test("range", () => take(10, range(1000000))); // 10ms
  test("L.range", () => take(10, L.range(1000000))); // 0.1ms

Lazy를 사용할 경우, 지연평가가 가능하기 때문에 10번만 실행됨. generator의 장점!

아래 코드에서 L.range(100000)에선 연산하지 않음, take, reduce와 같은 함수가 실행됐을 때 하나씩 실행되며 평가하기 때문에 최적화 가능!

go(
 L.range(100000),
 take(5), 
 reduce((a, b) => a + b)
)

참고 :
함수형 프로그래밍과 JavaScript ES6+ 강의
https://ko.javascript.info/generators

profile
프론트엔드 개발

0개의 댓글