본문 바로가기
JavaScript

[FP&ES6+] 즉시 평가와 지연 평가의 비교

by _sweep 2021. 12. 25.

함수형 프로그래밍과 JavaScript ES6+ 강의를 듣고 정리한 내용입니다.

 

 

 즉시 평가와 지연 평가의 중첩 사용 비교

즉시 평가를 사용하는 range, map, filter, take와 지연 평가를 사용하는 L.range, L.map, L.filter, take의 중첩 사용을 비교해 보고자 한다.

 

range, map, filter, take의 중첩 사용

go(
    range(10),
    map(n => n + 10),
    filter(n => n % 2),
    take(2),
    console.log
);

// output
// [11, 13]

 

go문 안에서의 실행 순서는 range, map, filter, take 순이다.

한 단계가 완료되면 다음 순서로 평가된 값을 넘기며 단계별로 실행된다.

 

 

L.range, L.map, L.filter, take의 중첩 사용

go(
    L.range(10),
    L.map(n => n + 10),
    L.filter(n => n % 2),
    take(2),
    console.log
);

// output
// [11, 13]

 

실행 순서는 take부터 시작된다.

이때 take가 받아야 할 이터러블의 자리에 알 수 없는 제너레이터 객체가 들어온다.

평가를 미뤄둔 값이라는 뜻으로 이제 평가가 필요할 때가 되었으니 filter, map, range 순으로 거슬러 올라가며 각 함수들이 평가를 미뤄두었던 자리에 들어가 평가를 시작한다.

 

거슬러 올라가 range에 다다르면 값 하나를 평가해 다시 내려보낸다.

이렇게 take가 평가를 필요로 할 때마다 미뤄두었던 평가를 하나씩 실행하며 거슬러 올라갔다 내려오기를 반복한다.

 

 

비교

지연 평가가 더 번거롭게 보일 수는 있지만 실제 연산에서는 즉시 평가보다 지연 평가가 더 효율적이다.

큰 값에 대해 비교를 실행한다면 이 차이는 더 극명하게 드러날 것이다.

 

 

 map, filter 계열 함수들이 가지는 결합 법칙

map, filter 계열의 함수들은 다음과 같은 결합 법칙을 가진다.

 

  • 사용하는 데이터가 무엇이든지
  • 사용하는 보조 함수가 순수함수(ex. n => n + 10)라면 무엇이든지

 

이러한 조건을 만족했을 때 아래의 둘은 동일한 결과를 출력한다.

 

  • [[mapping, mapping], [filtering, filtering], [mapping, mapping]]
  • [[mapping, filtering, mapping], [mapping, filtering, mapping]]

 

[[mapping, mapping], [filtering, filtering], [mapping, mapping]]는 각 값을 매핑 후 필터링하고 다시 매핑한다.

이는 즉시 평가를 나타낸 것이다.

위의 go문에서 한 단계를 완전히 끝낸 후 다음 단계를 순차적으로 실행하는 모습이다.

 

[[mapping, filtering, mapping], [mapping, filtering, mapping]]는 각 값에 대해 매핑-필터링-매핑하는 과정을 거친다.
이는 지연 평가를 나타낸 것이다.
위의 go문에서 평가가 필요한 시점이 올 때마다 거슬러 올라가며 미뤄둔 평가들을 실행해 나가는 모습이다.

 

 

 

 

 

'JavaScript' 카테고리의 다른 글

[FP&ES6+] 결과를 만드는 함수 - take  (0) 2021.12.27
[FP&ES6+] 결과를 만드는 함수 - reduce  (0) 2021.12.27
[FP&ES6+] L.map, L.filter  (0) 2021.12.25
[FP&ES6+] take  (0) 2021.12.25
[FP&ES6+] range & L.range  (0) 2021.12.22

댓글