[Swift] 모나드
참조 : Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어) , The Swift Programming Language Swift 5.6 Edition (iBooks)(https://books.apple.com/kr/book/the-swift-programming-language-swift-5-6/id881256329)
모나드란?
- 사용하는 곳에 따라 수학의 범주론/특정 디자인 패턴 모나드인지 다름
- 프로그래밍에서의 모나드는 범주론의 모나드의 의미 차용한 정도의 의미를 가짐 → 모나딕(Monadic)이라고 함
- 모나드의 성질을 갖는 타입이나 함수 → 모나드 타입 / 함수
- 모나드가 갖춰야 하는 조건
- 타입을 인자로 받는 타입(특정 타입의 값을 포장)
- 특정 타입의 값을 포장한 것을 반환하는 함수(메서드) 존재
- 포장된 값을 변환하여 같은 형태로 포장하는 함수(메서드) 존재
- 스위프트에서 모나드를 사용한 예 중 하나가 옵셔널(Optional)
- 닫힌 함수객체(Endofunctor) : 함수객체 중에서 자신의 컨텍스트와 같은 컨텍스트의 형태로 맵핑할 수 있는 함수객체
- 모나드도 닫힌 함수객체
- 함수객체는 포장된 값에 함수를 적용 가능
→ 모나드도 컨텍스트에 포장된 값을 처리하여 포장된 값을 컨텍스트에 다시 반환하는 함수(맵)을 적용 가능
→이런 맵핑을 수행하도록 flatMap 메서드 활용
컨텍스트(Context)
- 컨텍스트 : '콘텐츠(Content)를 담은 그 무엇인가' 를 뜻함
- 값이 없는 옵셔널 상태가 컨텍스트 → '컨텍스트는 존재하지만 내부에 값이 없다'
함수객체(Functor)
- 맵 : 컨테이너의 값을 변형시킬 수 있는 고차 함수
- 옵셔널은 컨테이너와 값을 가지기 때문에 맵 함수를 사용 가능
- 함수객체 : 맵을 적용할 수 있는 컨테이너 타입
플랫맵(flatMap)
- map(_:)과 flatMap(_:)의 비교
※ compactMap(_:) : flatMap(_:) 메서드를 Sequnce 타입이 Optional 타입의 Element를 포장한 경우에 사용
let optionals: [Int?] = [1, 2, nil, 5]
let mapped: [Int?] = optionals.map{ $0 }
let compactMapped: [Int] = optionals.compactMap{ $0 }
print(mapped) // [Optional(1), Optional(2), nil, Optional(5)]
print(compactMapped) // [1, 2, 5]
- 내부의 값을 1차원적으로 펼쳐놓는 작업도 함 → 값을 꺼내어 모두 동일한 위상으로 펼쳐놓는 모양새를 갖춤
- 플랫맵은 체이닝 중간에, 연산에 실패하는 경우나 값이 없어지는 경우( .none이 되거나 nil이 됨)에는
별도의 예외처리 없이 빈 컨테이너 반환
'iOS > Swift' 카테고리의 다른 글
[Swift] 프로퍼티와 메서드 (0) | 2022.09.20 |
---|---|
[Swift] 구조체와 클래스 (0) | 2022.09.16 |
[Swift] 옵셔널(Optional) (0) | 2022.09.15 |
[Swift] 함수 (0) | 2022.09.14 |
[Swift] 연산자 (0) | 2022.09.14 |