평가란 무엇인가.
함수에서의 평가는 함수를 수행해서 결과를 구한다이고, 즉, 함수의 평가란 변수를 주어진 숫자 또는 표현식으로 대체하는 것을 의미한다.
ex)
f(x) = 2x + 4 함수를 , x = 5로 평가한다면, x에 주어진 5를 대입한다.
f(5) = 2*5 + 4 = 14
f(5) = 14
평가에는 엄격한 평가와 지연 평가가 있다.
/* 엄격한 평가 */
var mi = 0;
var fi = 0;
_.go(
_.range(100) //0~인자값이 들어있는 배열을 리턴,
_.map(function(val) {
++mi; // 100번 루프
return val * val;
}),
_.filter(function(val) {
++fi; // 100번 루프
return val % 2;
}),
_.take(5), // 5개 꺼내기
console.log
);
console.log(mi, fi); // 100 100
/* 지연 평가로 성능 높이기 */
/* take(5) 에서 5개를 가져오는데 필요한만큼만 루프를 돈다 */
/* 하나를 제곱하면 바로 다음 필터에 넣어보고, true로 평가되면 take에 넣어서 하나를 축적, 5개가 축적될 때 까지 반복한다 */
var mi = 0;
var fi = 0;
_.go(
_.range(100),
L.map(function(val) {
++mi; // 10번 루프
return val * val;
}),
L.filter(function(val) {
++fi; // 10번 루프
return val % 2;
}),
L.take(5),
console.log
);
console.log(mi, fi); // 10 10
엄격한 평가
| val1 | val2 | val3 | val4 | val5 | val6 | |
|---|---|---|---|---|---|---|
| map | -> | -> | -> | -> | -> | -> |
| filter | -> | -> | x | -> | x | -> |
| map | -> | -> | -> | -> | ||
| reject | -> | -> | x | -> | ||
| take | O(1개) | O(2개) | -> |
엄격한 평가는, 말 그대로 순서에 맞게 엄격하게 평가한다.
map에서 각각을 모두 평가하여 val ~ val6을 평가한다.
다음 filter, map, reject에서도 마찬가지로 모두 평가한 뒤, take(2)에서 2개를 평가하고 끝낸다.
지연 평가
| val1 | val2 | val3 | val4 | val5 | val6 | |
|---|---|---|---|---|---|---|
| map | ↓ | ↓ | ↓ | ↓ | ||
| filter | x | ↓ | ↓ | ↓ | ||
| map | ↓ | ↓ | v | |||
| reject | ↓ | x | ↓ | |||
| take | O(1개) | O(2개) |
엄격한 평가는, 말 그대로 순서에 맞게 엄격하게 평가한다.
map에서 각각을 모두 평가하여 val ~ val6을 평가한다.
다음 filter, map, reject에서도 마찬가지로 모두 평가한 뒤, take(2)에서 2개를 평가하고 끝낸다.
partial.js에서 네임스페이스를 _대신 L로 변하면 지연평가가 되며, 나머지 연산은 실행되지 않도록 알아서 최적화를 해준다.
이는 map, filter 등이 순수함수이기 때문에 가능하다.
평가 시점이나 평가 순서와 상관없이 동일한 결과를 가져올 수 있기 때문이다.