할루루 2018. 2. 12. 12:18

[시작]


- 모나드 : 특정한 상태로 값을 포장하는 것

 : Swift에서는 이를 옵셔널이라는 형태로 구현 : 값이 있을지 없을지 모르는 상태 속에 포장

- 함수객체와 모나드는 디자인 패턴 혹은 자료구조라고 할 수 있음



[컨텍스트]


- 컨텍스트 : 콘텐츠를 담은 무언가

 : 옵셔널은 somenone이라는 두 가지의 컨텍스트를 가짐



[함수객체]


- 맵을 적용할 수 있는 컨테이너 타입

- 맵은 컨테이너(컨텍스트)의 값을 변형하는 고차함수

- 옵셔널에 맵을 적용했을 때

 : 값이 있는 경우 : 컨텍스트로부터 값 추출 -> 전달받은 함수 적용 -> 결과값을 컨텍스트에 담아 반환

 : 값이 없는 경우 : 컨텍스트로부터 값 추출 -> 값 없음 -> 아무것도 하지 않음



[모나드]


- 값이 있을 수도 있고 없을 수도 있는 컨텍스트를 갖는 함수객체 타입

- 플랫맵 : 포장된 값을 받아서 값이 있으면 포장을 풀어서 값을 처리한 후 포장된 값을 반환하고, 값이 없으면 없는 대로 다시 포장하여 반환

1
2
3
4
5
6
let optionalNumbers: [Int?] = [6,2,nil,9]
let map = optionalNumbers.map { $0 }
let flatmap = optionalNumbers.flatMap { $0 }
print(map)      //Optional(6), Optional(2), nil, Optional(9)
print(flatmap)  //6, 2, 9
 
cs


위는 플랫맵과 맵의 차이를 보여줌


- 옵셔널에 관련된 여러 컨테이너의 값을 연달아 처리할 때 플랫맵이 유용하게 사용될 수 있음



[마무리]


- 옵셔널 바인딩, 옵셔널 체이닝, 플랫맵 등은 모나드와 관련된 연산