foldRight
마지막 원소부터 첫 원소까지 접습니다 — fold의 오른쪽 결합 짝입니다.
강의
+, max, 문자열 이어붙이기처럼 결합 법칙이
성립하는 연산이라면 방향은 상관없고
fold 하나로 충분합니다. 그렇지 않은
경우에는 방향이 답을 결정합니다. fold는 왼쪽부터 감싸므로
[1, 2, 3]에 뺄셈을 적용하면
((0 - 1) - 2) - 3이 되고, foldRight는
오른쪽부터 감싸므로 1 - (2 - (3 - 0))이 됩니다.
자연스러운 쓰임은 무언가를 감싸는 결과를 만들 때입니다. 중첩된 구조, 데코레이터 사슬, 각 단계가 나머지 결과를 품어야 하는 연결 리스트 같은 것들이죠. 왼쪽 fold로 쓰면 안팎이 뒤집힌 채로 나옵니다.
리듀서는 Haskell foldr처럼 인자를 뒤집지 않고
fold의 (acc, element) 순서를 그대로 지킵니다.
같은 콜백이 양쪽 방향 모두에서 동작하므로, 고쳐 쓰지 않고 서로 바꿔 끼울
수 있습니다.
foldRightWithIndex가 알려주는 인덱스는 원본에서의
위치입니다. 그래서 마지막 원소가 가장 큰 인덱스를 달고 먼저
도착합니다 —
foldWithIndex가 같은 원소에
줬을 바로 그 번호입니다. 거꾸로 도는 순회를 0, 1, 2로 다시 매기지
않은 것은 의도적입니다. 연산자마다 다른 뜻을 갖는 인덱스보다는
거꾸로 세는 인덱스가 낫습니다.
둘 다 fold와 달리 엄격합니다. 뒤에서부터 걸으려면 끝이
어디인지 알아야 하므로, List가 아닌 소스는 먼저 실체화되고
foldRightAsync는 스트림을 모두 받아낸 뒤에 시작합니다.
무한한 소스에는 절대 겨누지 마세요.
데모 1 · 방향이 답을 바꾼다
데모 2 · 인덱스와 함께, 그리고 비동기
직접 해 보기
연습: 파이프라인을 바깥 단계부터 중첩된 호출로 그려 보세요.
fold — 같은 축약을 왼쪽에서 ·
reduce — 첫 원소를 씨앗으로 ·
foldWithIndex — 위치를 함께 받는 왼쪽 fold ·
reverse — 뒤에서부터 걷는 또 하나의 방법