Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Stacking Fire

Swift 16. 모나드 본문

개발/Objective-C -> Swift

Swift 16. 모나드

라우비 2017. 8. 14. 17:10

Monad [|mɑ:nӕd;|moʊn-]

(철학)모나드(무엇으로도 나눌 수 없는 궁극적인 실체)

Oxford Advanced Learner's English-Korean Dictionary

...왜 이 개념이 이렇게 쓰였는지는 아직 모르겠습니다. 더 공부해 보겠습니다.

컨텍스트

  • 맥락. 어떤 위치에 어떤 값이 존재할 수 있는 맥락.
  • 옵셔널은 맥락은 존재하지만 값이 필연적으로 존재하지는 않을 수도 있는 부분에 들어감.
  • 값과 컨텍스트는 다르다. 그래서 옵셔널은 값을 대신할 수 없다!
func add3(to int: Int) -> Int {
    return int + 3
}
    
add3(to: Optional(2)) // 오류! 
// 값이 들어가야 하는 곳에 컨텍스트만이 들어갔다.

함수객체

  • 함수객체란 맵을 적용할 수 있는 컨테이너 타입 (Optional, Array, Dictionary...)
  • 옵셔널은 컨테이너, 함수 객체. map을 사용하는 것이 가능하다.
  • 컨테이너를 해제하지 않은 채로 값을 연산한 후 되돌려준다.
var optionalNumber: Int? = 2
    
print( optionalNumber.map({ add3(to: $0) }) ) //Optional(5), 2번 연산
    
optionalNumber = nil
    
print( optionalNumber.map({ add3(to: $0) }) ) //nil, 연산 횟수는 없다?

모나드

  • 값이 있을지 없을지 모르는 컨텍스트를 가지는 함수객체
  • 대표적으로 옵셔널. 혹은 옵셔널을 값으로 가지는 콜렉션 [Int]같은 것들.
  • 여기에 대응하는 것이 flatMap! 값이 있을지 미지수인 컬렉션을 쉽게 조작할 수 있도록 해줍니다.
let possibleNumberStringArray: [String] = ["2", "아닌데?", "103", "323"]

let numbers: [Int] = possibleNumberStringArray.map { Int($0) }.flatMap { $0 }

print(numbers) //[2, 103, 323]

let oneLineSumWithFunctionChaining: Int = possibleNumberStringArray.map { Int($0) }.flatMap { $0 }.reduce(0){ $0 + $1 }

print(oneLineSumWithFunctionChaining) //428

나가면서

여전히 왜 '궁극의 실체'인지는 모르겠습니다. 컴퓨터 안에서 궁극적으로 옵셔널이 아닌 값은 없다는 의미일까요?

'개발 > Objective-C -> Swift' 카테고리의 다른 글

Swift 15. 맵, 필터, 그리고 리듀스  (0) 2017.08.12
Swift 14. 옵셔널 체이닝, 그리고 빠른 종료  (0) 2017.08.10
Swift 13. 클로저  (0) 2017.07.12
Swift 12. 접근제어  (0) 2017.07.10
Swift 11. 이니셜라이저  (0) 2017.07.03
Comments