inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

함수형 프로그래밍과 JavaScript ES6+

L.range, L.map, L.filter, take 의 평가 순서

질문있습니다.

342

hhhh

작성한 질문수 24

0

const Lazy = {
  *range(num) {
    for (let i = 0i < numi++) {
      yield i;
    }
  },
  *filter(predicateiterable) {
    for (const value of iterable) {
      if (predicate(value)) { yield value; }
    }
  },
  *take(numiterable) {
    let cnt = 0;

    for (const value of iterable) {
      cnt++;
      yield value;
      if (cnt >= num) { break; }
    }
  }
};

console.time('Lazy');
Array.from(Lazy.take(3Lazy.filter(num => num % 2 === 0Lazy.range(100000))));
console.timeEnd('Lazy');

이해가 한번에 잘 안되어 질문 남깁니다 :)

위 코드를 실행하면, 똑같이 지연평가를 수행하지만

영상과는 반대로 range -> filter -> take 순서로 실행합니다.

지연 평가가 연산의 역순이 핵심이 아니라, yield를 통한 각 요소마다의 다음 연산으로 제어권 위임이 핵심이 맞나요??

javascript 함수형-프로그래밍

답변 2

0

hhhh

이제 이해했습니다.

감사합니다.

0

MDU 유인동

작성하신 코드를 이렇게 실행하면 take, filter, range 순으로 실행되는 것을 볼 수 있습니다.

range가 연산을 미루고 이터레이터를 반환한 다음 그 이터레이터의 next를 filter에서 실행하도록 준비를한 이터레이터를 take가 받고, take 역시 연산을 미뤄둔 다음 그 값이 실제로 필요한 Array.from의 내부에서 이터레이터의 next를 처음 실행할 때까지 미뤄지는 컨셉, 지연평가라고 불려지고 있는 개념을 설명해드리고자 하는게 영상 내용의 핵심이고 제너레이터는 그것을 구현하는 하나의 방법입니다.

지연평가를 제너레이터로 구현했을 때 yield 가 핵심적인 역할을 하는 포인트라고 말할 수 있을 것 같습니다. 그러나 제너레이터와 이터레이터, 그리고 for...of와 이터러블 프로토콜이 모두 상호 동작하여 이루어지기 때문에 전체적인 동작과 컨셉이 모두 중요하다고 생각합니다.

이전 질문 주신 질문에 답변 드렸듯이 지연평가를 구현하기 위해서 제너레이터는 필수가 아니며 이터레이터만으로 만들 수 있습니다. 

이터레이터만으로 만들고 이터레이터가 이터러블 프로토콜을 따르지 않게 만들 수도 있고, 개인적으로 또 다른 프로토콜을 만드는 것을 통해서도 구현할 수 있겠습니다만.

본 강의는 자바스크립트 언어(ES6+)의 많은 요소들과 함께 어우려져 동작하는 이터러블 프로토콜을 다루어 자바스크립트에서 잘 동작하고 어우러지는 함수형 프로그래밍을 전달하는 것이 강의의 목적입니다. (구조분해, 전개, for...of 등)

답변이 되셨길 바랍니다.

감사합니다.

프론트엔드 실무에서 어떤때에 쓰이는지 궁금합니다

1

111

1

함수형 프로그래밍 심화 강의 자료 추천

0

72

2

함수형 자바스크립트 프로그래밍 책

0

52

1

filter가 아무것도 걸러내지 못하는 경우

0

113

1

take 함수의 성능적면에서의 이점

1

463

1

pipe함수

1

530

1

Identity 함수

0

450

1

함수형 프로그래밍이란

0

831

1

reduce 예제 코드 제안!

0

404

1

fxts를 배워보려고 합니다.

1

537

1

flatMap 관련 질문드립니다~

1

444

1

다용성이 높은 L.flatMap

0

357

1

변수에 재 할당 금지~

0

540

1

DevTools라고 옆에 결과 확인하는거 어떻게 하나요?

0

483

2

소요시간에 관해서 질문드립니다

1

457

1

join에 대한 내용이 궁금증이 해결되지 않아서 질문드립니다!

0

465

2

reduce에 L.range를 사용할 때

0

526

2

[이해내용 공유] Lazy 에서 C.reduce가 병렬 효과를 내는 이유

3

738

2

제가 이해한 C.Reduce와 Reduce의 동작 차이 정리

2

787

3

go, pipe 함수 관련하여 질문 드립니다.

1

498

1

안녕하세요 강사님!

0

379

2

fxts에 go가 없는 이유?

0

839

1

비동기 관련 질문입니다!

0

460

1

질문 있습니다.

0

515

1