이 시리즈는 "스칼라로 배우는 함수형 프로그래밍"을 TypeScript로 실습한 내용을 정리하고 있습니다.
sum, product는 빈 목록일때의 반환값, 결과를 결합하는 연산을 제외하면 동일하다. 이 두 함수를 일반화 하여 반환값 z와 연산 f를 직접 입력받는 함수를 만들 수 있다. 나중에 나오겠지만 빈 값(항등원)과 두 원소를 결합하는 연산자가 존재하고 연산의 순서가 관계없기 때문에 이것은 monoid이다.
이렇게 만들어진 foldRight는 목록의 생성자 Nil과 Cons를 각각 z와 f로 치환하게 된다.
Cons(1, Cons(2, Nil))
f (1, f (2, z ))
Cons
와 f
를 각각 infix 연산자 ::
과 <>
로 대체해보면 이렇게 된다. 2항 연산자를 infix연산자로 대체해서 생각해볼수도 있다. foldRight 평가 과정 추적에도 이 방식을 도입하면 <>이 +로, z는 0으로 바뀔 뿐이다.
(1 :: (2 :: Nil))
(1 <> (2 <> z))
foldRight는 반드시 목록의 끝까지 순회(traverse)해야 하나의 값으로 축약(collapsing)됨을 주목하자.
https://github.com/JsonKim/fpinscala-with-typescript/commit/a9b4288154d00c5a4f8b85128c723bc05a76b94f
https://github.com/JsonKim/fpinscala-with-typescript/commit/299ef61e45900c2cd792254e60e4f4db642217a5
https://github.com/JsonKim/fpinscala-with-typescript/commit/5e08a1e0a2019f7b6055f395a00219def1f4f9c5