함수적 자료구조 - List (3)

Jason Kim·2020년 5월 5일
0

이 시리즈는 "스칼라로 배우는 함수형 프로그래밍"을 TypeScript로 실습한 내용을 정리하고 있습니다.

목록에 대한 재귀와 고차 함수로의 일반화

sum, product는 빈 목록일때의 반환값, 결과를 결합하는 연산을 제외하면 동일하다. 이 두 함수를 일반화 하여 반환값 z와 연산 f를 직접 입력받는 함수를 만들 수 있다. 나중에 나오겠지만 빈 값(항등원)과 두 원소를 결합하는 연산자가 존재하고 연산의 순서가 관계없기 때문에 이것은 monoid이다.

이렇게 만들어진 foldRight는 목록의 생성자 Nil과 Cons를 각각 z와 f로 치환하게 된다.

Cons(1, Cons(2, Nil))
f   (1, f   (2, z  ))

Consf를 각각 infix 연산자 ::<>로 대체해보면 이렇게 된다. 2항 연산자를 infix연산자로 대체해서 생각해볼수도 있다. foldRight 평가 과정 추적에도 이 방식을 도입하면 <>이 +로, z는 0으로 바뀔 뿐이다.

(1 :: (2 :: Nil))
(1 <> (2 <> z))

foldRight는 반드시 목록의 끝까지 순회(traverse)해야 하나의 값으로 축약(collapsing)됨을 주목하자.

연습문제 3.7~3.10

https://github.com/JsonKim/fpinscala-with-typescript/commit/a9b4288154d00c5a4f8b85128c723bc05a76b94f

연습문제 3.11~3.15

https://github.com/JsonKim/fpinscala-with-typescript/commit/299ef61e45900c2cd792254e60e4f4db642217a5

연습문제 3.16~3.24

https://github.com/JsonKim/fpinscala-with-typescript/commit/5e08a1e0a2019f7b6055f395a00219def1f4f9c5

0개의 댓글