Take

  • 특정 범위까지 배열로 리턴하는 함수
const take = (l, iter) => {
  let res = [];

  for (const a of iter) {
    res.push(a);

    if (res.length === l) {
      return res;
    }
  }

  return res;
};

console.log(take(5, range(100))); // [0,1,2,3,4]
console.log(take(5, L.range(100))); // [0,1,2,3,4]

take함수 안에서 range, L.range 함수 효율성

  • 마찬가지로 L.range와 range 효율성 차이발생
  • 일반 range함수는 특정 범위까지 배열을 만들고 나서 take 함수 진행
  • 하지만 L.range는 배열을 만들지 않고 take의 첫 번째 인자인 5개의 값만 가진 배열을 만듬
console.time('');
console.log(take(5, range(100000))); // 9.27197265625ms
console.timeEnd('');

console.time('');
console.log(take(5, L.range(100000))); // 0.43896484374ms
console.timeEnd('');

take함수에 curry 적용

const take = curry((l, iter) => {
  let res = [];

  for (const a of iter) {
    res.push(a);

    if (res.length === l) {
      return res;
    }
  }

  return res;
});

// L.range는 제너레이터 함수 리턴
// take, reduce를 만나기 전까지는 값을 만들지 않음
// 그러다가 take, reduce에서 값을 필요하면
// 그 때, next().value로 값을 리턴함
go(L.range(100), take(5), reduce(add));


느낀점

다시 한번 함수형 프로그래밍에 대한 장점을 알게되었다. 정말 효율성이 너무 좋은 것 같다.

제대로 학습해서 실무에서 무조건 적용해야 겠다.


참고

유인동님의 함수형 프로그래밍과 JS ES6+ 강의