Skip to content

Commit e936611

Browse files
authored
Merge pull request #4 from goohooh/master
chapter 6 : accumulator
2 parents 5491c8d + 2f66e0e commit e936611

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# 어큐뮬레이터
2+
3+
## 개념
4+
5+
- 집합을 반복하여 하나의 결과를 만들어냄
6+
- 배열 요소의 합산 같은 일반적 작업은 루프 대신 어큐뮬레이터로 구현 가능
7+
8+
## 재귀, 꼬리 호출 최적화
9+
10+
함수형 프로그래밍에서 재귀는 인기있는 방법이며 **꼬리 호출 최적화**를 제공함 - [꼬리호출 관련 링크](http://homoefficio.github.io/2015/07/27/%EC%9E%AC%EA%B7%80-%EB%B0%98%EB%B3%B5-Tail-Recursion/)
11+
12+
- 이를 제공하는 언어는 스택 프레임이 재사용되는 재귀를 사용해 함수의 최적화를 제공
13+
- 효율적, 대부분의 루프를 쉽게 교체할 수 있음
14+
- 모든 JS 인터프리터에서 지원되지는 않지만 재귀는 사용 가능
15+
16+
## for 루프의 문제점
17+
18+
**문제** : for 루프를 통한 제어 흐름이 가변적
19+
20+
```js
21+
var result = '';
22+
var multiArray = [[1,2,3], ['a', 'b', 'c']];
23+
for(var i = 0; i < multiArray.length; i++){
24+
for(var j = 0; i < multiArray[i].length; j++){
25+
result += multiArray[i][j];
26+
}
27+
}
28+
29+
// 두번째 루프의 카운터에 문제가 있다!
30+
31+
var result = '';
32+
var multiArray = [[1,2,3], ['a', 'b', 'c']];
33+
for(var i = 0; i < multiArray.length; i++){
34+
for(var j = 0; j < multiArray[i].length; j++){
35+
result += multiArray[i][j];
36+
}
37+
}
38+
```
39+
40+
변수 이름을 잘 정하여 문제를 완화시킬 순 있지만, 우린 이를 완전 차단하여야 한다.
41+
42+
웨스테로스의 예제로 돌아가 보자
43+
44+
## 구현
45+
46+
> 전쟁은 많은 비용이 들지만, 농민의 세금과 영주의 재정 지원이 있다.
47+
48+
```js
49+
const peasants = [
50+
{name: 'Jory', taxesOwed: 11, bankBalance: 50},
51+
{name: 'Vardis', taxesOwed: 15, bankBalance: 20}
52+
];
53+
54+
TaxCollector.prototype.collect = (items, value, projection) => {
55+
if (items.length > 1){
56+
return projection(items[0]) + this.collect(items.slice(1), value, projection);
57+
}
58+
59+
return projection(itms[0]);
60+
}
61+
```
62+
위 코드는 항목과 어큐뮬레이터 값, 어큐뮬레이터에 통합되는 값을 투사하는 함수를 인자로 받는다.
63+
64+
```js
65+
// 프로젝션 함수
66+
item => Math.min(item.moneyOwed, item.bankBalance);
67+
```
68+
69+
이 함수를 준비시키기 위해 단순히 배열 및 프로젝션과 함께 어큐뮬레이터의 초기값을 전달해야 한다.
70+
71+
어큐뮬레이터를 통한 각 패스는 배열 크기를 축소시킨다.
72+
73+
이 모든 것이 가변 변수 없이 진행된다.
74+
75+
---
76+
77+
내부 어큐뮬레이션은 문자열 첨부나 추가, 좀 더 복잡한 함수도 될 수 있다.
78+
79+
어큐뮬레이터는 어큐뮬레이터 내부 집합의 값의 변경이 어렵다는 점만 제외하고 방문자 패턴과 유사하다.
80+
81+
**함수형 프로그램은 부작용이 없다**
82+

0 commit comments

Comments
 (0)