코틀린으로 배우는 함수형 프로그래밍
표지
목차
1장 함수형 프로그래밍이란?
1.1 함수형 프로그래밍의 특징
1.2 순수한 함수란 무엇인가?
____동일 입력 동일 출력
____부수효과 없는 코드
____순수한 함수의 효과와 그외 고려사항
1.3 부수효과 없는 프로그램 작성하기
____공유 변수 수정으로 인한 부수효과
____객체의 상태 변경으로 인한 부수효과
1.4 참조 투명성으로 프로그램을 더 안전하게 만들기
____참조 투명하지 않은 함수
____참조 투명한 함수
1.5 일급 함수란?
____일급 객체(first-class object)
____일급 함수(first-class function)
1.6 일급 함수를 이용한 추상화와 재사용성 높이기
____간단한 계산기 예제
____객체지향적으로 개선한 계산기 예제
____함수형 프로그래밍 방식으로 개선한 계산기 예제
1.7 게으른 평가로 무한 자료구조 만들기
____무한대 값을 자료구조에 담다
1.8 마치며
____코틀린으로 함수형 프로그래밍 시작하기
2장 코틀린으로 함수형 프로그래밍 시작하기
2.1 프로퍼티 선언과 안전한 널 처리
____프로퍼티 선언
____안전한 널 처리
2.2 함수와 람다
____함수를 선언하는 다양한 방법
____매개변수에 디폴트값 설정하기
____익명 함수와 람다 표현식
____확장 함수
2.3 제어 구문
____if문
____when문
____for문
2.4 인터페이스
____인터페이스의 특징
____인터페이스 선언하고 상속하기
____인터페이스에 추상 함수 선언하기
____추상 함수 구현하기
____추상 프로퍼티의 선언과 사용
2.5 클래스
____클래스와 프로퍼티
____data 클래스
____enum 클래스
____sealed 클래스
2.6 패턴 매칭
____다양한 패턴 정의 방법
____조건에 따른 패턴 매칭
____코틀린 패턴 매칭의 제약
2.7 객체 분해
2.8 컬렉션
____리스트와 세트
____맵
2.9 제네릭
____제네릭 함수 선언
2.10 코틀린 표준 라이브러리
____let 함수
____with 함수
____run 함수
____apply 함수
____also 함수
____let, with, run, apply, also 함수 비교
____use 함수
2.11 변성
____무공변의 의미와 예
____공변의 의미와 예
____반공변의 의미와 예
____in, out으로 변성 선언하기
2.12 마치며
3장 재귀
3.1 함수형 프로그래밍에서 재귀가 가지는 의미
____피보나치 수열을 명령형 프로그래밍으로 구현한 예제
____피보나치 수열을 재귀로 구현한 예제
____함수형 프로그래밍에서 재귀
3.2 재귀를 설계하는 방법
____재귀 함수 설계 방법
____재귀가 수행되는 흐름 관찰해 보기
____재귀 함수 설계 방법을 사용하여 코드를 구현하기
3.3 재귀에 익숙해지기
____reverse 함수 예제
____take 함수 예제
____repeat 함수 예제
____zip 함수 예제
3.4 메모이제이션으로 성능 개선하기
____재귀적인 방식의 피보나치 수열 예제
____메모이제이션을 사용한 피보나치 수열 예제
____재귀의 문제점을 함수적으로 해결하기
3.5 꼬리 재귀로 최적화하기
____꼬리 재귀 최적화란?
____maximum 함수를 꼬리 재귀로 다시 작성하기
____reverse 함수 꼬리 재귀로 다시 작성하기
____take 함수를 꼬리 재귀로 다시 작성하기
____zip 함수를 꼬리 재귀로 다시 작성하기
3.6 상호 재귀를 꼬리 재귀로 최적화하기
____상호 재귀
____트램펄린
3.7 실전 응용
____멱집합을 구하는 함수
3.8 마치며
4장 고차 함수
4.1 고차 함수란?
____고차 함수 조건을 만족하는 예
____코드의 재사용성을 높인다
____기능의 확장이 쉽다
____코드를 간결하게 작성할 수 있다
4.2 부분 함수
____부분 함수의 예
____부분 함수 만들기
____부분 함수의 필요성
4.3 부분 적용 함수
4.4 커링 함수
____코틀린용 커링 함수 추상화하기
4.5 합성 함수
____함수 합성 일반화하기
____포인트 프리 스타일 프로그래밍
____하나 이상의 매개변수를 받는 함수의 합성
4.6 실전 응용
____zipWith 함수
____콜백 리스너를 고차 함수로 대체하기
4.7 마치며
5장 컬렉션으로 데이터 다루기
5.1 함수형 컬렉션의 데이터 처리
____간단한 리스트 자료구조 만들기
____addHead 함수 만들기
____appendTail 함수 만들기
____꼬리 재귀로 작성한 appendTail 함수의 시간 복잡도
____getTail 함수 만들기
5.2 컬렉션 데이터 걸러 내기
____명령형 방식 vs. 함수형 방식
____filter 함수 만들기
5.3 컬렉션 데이터 변경하기
____명령형 방식 vs. 함수형 방식
____map 함수 만들기
5.4 컬렉션 데이터 단계별로 줄이기
____foldLeft 함수 만들기
____foldLeft 함수 사용하기
____foldLeft 함수로 toUpper 함수 작성하기
____foldRight 함수 만들기
____foldLeft vs. foldRight
5.5 여러 컬렉션 데이터 합치기
____zipWith 함수 만들기
5.6 코틀린 리스트를 사용한 명령형 방식과 함수형 방식 비교
____명령형 방식과 함수형 방식의 기능 비교
____명령형 방식과 함수형 방식의 성능 비교
5.7 게으른 컬렉션 FunStream
____FunList vs. FunStream 선언 방법 비교
____FunList vs. FunStream 성능 비교
____FunStream으로 무한대 값 만들기
5.8 실전 응용
____FunList에 printFunList 함수 추가하기
5.9 마치며
6장 함수형 타입 시스템
6.1 타입 시스템
____타입 시스템의 종류와 특징
____함수형 언어의 정적 타입 시스템
6.2 대수적 데이터 타입
____곱 타입의 예와 한계
____합 타입 사용한 OR 결합
____함수형 프로그래밍에서의 대수적 데이터 타입
6.3 타입의 구성요소
____타입 변수
____값 생성자
____타입 생성자와 타입 매개변수
6.4 행위를 가진 타입 정의하기
____인터페이스 vs. 트레이트 vs. 추상 클래스 vs. 믹스인
____타입 클래스와 타입 클래스의 인스턴스 선언하기
6.5 재귀적 자료구조
6.6 실전 응용
____대수적 합 타입의 장점
6.7 마치며
7장 펑터
7.1 펑터란?
____펑터 선언하기
7.2 메이비 펑터 만들기
7.3 트리 펑터 만들기
7.4 이더 펑터 만들기
7.5 단항 함수 펑터 만들기
7.6 펑터의 법칙
____펑터 제1 법칙
____펑터 제2 법칙
____펑터의 법칙을 만족하지 못하는 펑터 인스턴스의 예
7.7 실전 응용
____매개변수가 한 개 이상인 함수로 매핑하기
7.8 마치며
8장 애플리케이티브 펑터
8.1 애플리케이티브 펑터란?
____애플리케이티브 펑터의 정의
____애플리케이티브 펑터 타입 클래스
8.2 메이비 애플리케이티브 펑터 만들기
____메이비 애플리케이티브 펑터 사용해 보기
____애플리케이티브 스타일
____확장 함수를 사용한 메이비 애플리케이티브 펑터 만들기
8.3 트리 애플리케이티브 펑터 만들기
____일반 트리 펑터 만들기
____애플리케이티브 펑터로 확장하기
8.4 이더 애플리케이티브 펑터 만들기
8.5 애플리케이티브 펑터의 법칙
____항등(Identity) 법칙
____합성(Composition) 법칙
____준동형 사상(Homomorphism) 법칙
____교환(Interchange) 법칙
____펑터와 애플리케이티브 펑터 간의 관계
8.6 실전 응용
____liftA2 함수 만들기
____sequenceA 함수 만들기
8.7 마치며
9장 모노이드
9.1 모노이드란?
9.2 모노이드 타입 클래스
____간단한 모노이드 타입 클래스 선언
____모노이드의 법칙
____mconcat 함수 만들기
9.3 메이비 모노이드 만들기
____메이비 모노이드 검증하기
9.4 폴더블 바이너리 트리에 foldMap 함수 만들기
____foldMap 함수
____폴더블 바이너리 트리 만들기
9.5 실전 응용
____바이너리 트리 내에 특정 값이 존재하는지 확인하기
____foldMap을 사용하여 바이너리 트리를 리스트로 바꾸기
9.6 마치며
10장 모나드
10.1 모나드 타입 클래스
10.2 메이비 모나드
____메이비 모나드 활용
10.3 모나드 법칙
____왼쪽 항등(left identity) 법칙
____오른쪽 항등(right identity) 법칙
____결합(associativity) 법칙
____함수 합성 관점에서의 모나드 법칙
10.4 IO 모나드
____입출력 작업이 외부와 분리되지 않은 예
____입출력 작업이 외부와 분리된 예
10.5 리스트 모나드
____FunList 기본 골격 선언하기
____리스트 생성 함수 및 출력 함수 만들기
____리스트 모노이드로 만들기
____fmap 함수 구현하기
____pure와 apply 함수 구현하기
____flatMap 함수 구현하기
10.6 실전 응용
____리스트 생성하기
____두 리스트의 모든 조합의 튜플 리스트 만들기
____리스트의 문자를 대문자로 변환하기
____리스트의 값에 함수 적용하기
____중복 문자 제거하기
____리스트 구성요소 뒤집기
10.7 마치며
11장 로깅, 예외처리, 테스팅, 디버깅
11.1 함수형 프로그래밍에서 로깅하기
____명령형 프로그래밍에서의 로깅
____함수형 프로그래밍에서의 로깅
____확장 함수를 사용해서 개선하기
____라이터 모나드 만들기
11.2 함수형 프로그래밍에서 예외처리하기
____널값이나 -1을 사용한 예외처리
____메이비 모나드를 사용한 예외처리
____이더 모나드를 사용한 예외처리
____트라이 모나드를 사용한 예외처리
11.3 함수형 프로그래밍에서 테스팅하기
____테스트하기 좋은 코드 만들기
____순수한 함수 테스트하기
____부수효과가 존재하는 함수 테스트하기
11.4 함수형 프로그래밍에서 디버깅하기
____디버깅 팁과 도구
____인텔리제이를 활용한 리스트 체인 디버깅
____인텔리제이를 활용한 시퀀스 체인 디버깅
11.5 마치며
출판사
This post is licensed under CC BY 4.0 by the author.