반응형
Context
Swift의 Monad에 대해 이해하기 위해서는 먼저 Context와 Content의 관계에 대해 이해해야 합니다. Content는 Context에 들어갈 수 있는 '어떤 것'이며, Context는 Content를 보관할 수 있는 '어떤 것'입니다. 상당히 포괄적인 개념이기에 저 그림에 보여지는 관계정도만 이해해도 충분합니다. 어쨌든 핵심은 Context에 무언가를 담을 수 있다는 것이죠.
- Collection들은 Context입니다. 내부에 인자들을 담을 수 있기 때문입니다.
- Optional 또한 Context입니다. 내부에 값을 보유할 수 있기 때문입니다.
Functor
다음으로 알아야하는 것은 Functor입니다. Functor는 고차함수 map을 적용할 수 있는 모든 컨테이너 타입을 의미합니다. 위 그림처럼 어떤 형태로든 내부에 값을 보유하여 이를 꺼내고 연산을 수행한 다음 다시 이를 넣어 반환하는 것입니다.
- 다들 익숙하게 사용하셨듯, Collection들은 Functor입니다.
- Optional 또한map을 적용할 수 있기 때문에 Functor입니다. Optional 박스 내부에서 값을 꺼내 연산을 적용시킨다고 생각하면 이해가 바로 되네요.
Swift - Monad
Monad는 이런 Functor의 일종입니다. Functor가 내부에 값이 존재할지 안할지 알 수 없는 상태일 경우 이를 Monad라고 표현합니다. 즉, Monad는 값이 있을 수도 있고 없을 수도 있는 Context를 가지는 Functor입니다.
- 그렇게 생각하면 배열은 Monad가 아닙니다.
- 하지만 Optional은 Monad입니다. 내부에 값이 존재할 수도 있고 안할 수도 있는 것이 옵셔널의 정의였기 때문에 당연하다는 생각도 듭니다.
Monad를 공부하고나니 flatMap을 사용했을 때 왜 Optional이 벗겨지는지 더 와닿았습니다. 결국 Optional도 Context를 보유한 객체기 때문에 그 Context에서 값을 빼오는 것이 Collection에서 Context를 벗기는 것과 큰 차이가 없다고 자연스럽게 받아들여지네요!
참고
반응형
'🍎 Apple > Swift' 카테고리의 다른 글
[Swift] NotificationCenter (0) | 2022.03.07 |
---|---|
[Swift] KVC(Key-Value Coding), KVO(Key-Value Observing) (0) | 2022.03.01 |
[Swift] Property Wrapper (0) | 2022.02.24 |
[Swift] Copy on write (2) | 2022.01.26 |
[Swift] 문자열 처리 (0) | 2022.01.22 |