CHAPTER 16 모나드
모나드는 특정한 상태로 값을 포장하는 것에서 출발
함수객체와 모나드는 특정 기능이 아닌 디자인 패턴 혹은 자료구조라고 할 수 있습니다.
‘콘텐츠’를 담은 그 무엇인가’를 뜻합니다.
옵셔널은 some과 none이라는 두 가지의 컨텍스트를 갖습니다.
__16.2 함수객체
옵셔널은 컨테이너(컨텍스트가 일종의 컨테이너 역할을 합니다)와 값을 갖기 때문에 맵 함수를 사용할 수 있습니다.
‘함수객체란 맵을 적용할 수 있는 컨테이너 타입’
Array, Dictionary, Set 등등 스위프트의 많은 컬렉션 타입이 함수객체
옵셔널 map 메서드 구현
Optional(2).map(addThree)
Optional.none.map(addThree)
__16.3 모나드
모나드는 함수객체의 일종으로 맵 함수를 적용할 수 있는, 즉 맵 함수를 지원하는 컨테이너 타입
거기에 더 나아가 값이 있을지 없을지 모르는 상태를 추가
즉, 모나드는 값이 있을 수도 있고 없을 수도 있는 컨텍스트를 갖는 함수객체 타입
플랫맵
플랫맵은 포장된 값을 받아서 값이 있으면 포장을 풀어서 값을 처리한 후 포장된 값을 반환하고, 값이 없으면 없는 대로 다시 포장하여 반환
맵과 플랫맵의 차이
내부의 값을 알아서 더 추출해준다는 것
플랫맵은 내부에 포장된 값도 추출해낼 수 있습니다.
맵 메서드를 사용한 결과는 Array 컨테이너 내부의 값 타입이나 형태가 어찌 되었든, Array 내부에 값이 있으면 그 값을 그저 클로저의 코드에서만 실행하고 결과를 다시 Array 컨테이너에 담기만 합니다.
플랫맵을 통해 클로저를 실행하면 알아서 내부 컨테이너까지 값을 추출
mappedArr
[Int?] 타입
flatmappedArr
[Int] 타입
중첩된 컨테이너에서 맵과 플랫맵의 차이
플랫맵은 내부의 값을 1차원적으로 펼쳐놓는 작업도 하기 때문에, 값을 꺼내어 모두 동일한 위상으로 펼쳐놓는 모양새
값을 일자로 평평하게 펼친다고 해서 플랫맵
플랫맵의 활용
맵을 사용하여 체인을 연결하면 옵셔널의 옵셔널 형태로 반환
플랫맵은 함수의 결괏값에 값이 있다면 추출해서 평평하게 만드는 과정을 내포하고, 맵은 그렇지 않기 때문
플랫맵은 추출 작업을 통해 옵셔널에서 꺼내온 값을 다시 옵셔널에 넣어주기 때문에 이같은 연쇄 연산도 가능
옵셔널 바인딩을 통한 연산
만약에 플랫맵을 사용하지 않으면서도 플랫맵과 같은 효과를 얻으려면 바인딩을 직접 해주어야 합니다.
플랫맵 체이닝 중 빈 컨텍스트를 만났을 때의 결과
플랫맵은 체이닝 중간에, 연산에 실패하는 경우나 값이 없어지는 경우(.none이 된다거나 nil이 된다는 등) 이외에는 별도의 예외 처리없이 빈 컨테이너를 반환
바로 옵셔널이 모나드이기 때문에 가능한 것
옵셔널 체이닝, 옵셔널 바인딩, 플랫맵 등은 모나드와 관련된 연산
참고
야곰의 스위프트 프로그래밍 https://book.naver.com/bookdb/book_detail.nhn?bid=12571019
댓글