안녕하세요. 도미닉입니다.
오늘은 Functor 와 Monad 에 대해서 알아보겠습니다.
Functor 란?
Functor 는 일반적으로 Map 이라는 함수를 실행해서 같은 타입의 결고값을 얻는 것을 의미합니다.
예를 들어 [1,2,3,4,5] 라는 배열의 Map 함수를 실행해서 [2,4,6,8,10] 이 반환된다면 이러한 배열 타입은 Functor 입니다.
그렇다면 [1,2,3,4,5] 이 Map 이라는 함수에 넣어서 [true,true,false,false,false] 가 리턴된다면 이 배열의 타입은 Functor 일까요?
Functor 가 맞습니다.
위에서 적었던 대로 Map 이라는 함수를 실행해서 같은 타입인 배열이 리턴되었기 때문입니다.
Functor 는 값을 빼낼 수 없습니다.
값을 꺼내는 것은 순수한 펑터의 개념을 벗어나는 일입니다.
펑터를 이용하는 유일한 방법은 타입 안전성을 유지하면서 값을 변형해 나가는 것 뿐입니다.
Monad 란?
Monad 는 Functor 에 포함됩니다.
모나드에서는 특별히 flatmap 이라는 함수가 구현되어야합니다.
모나드는 Map 이라는 함수에 넣어서 정의역과 같은 숫자의 치역이 리턴되기만 했던 Functor 와 달리
같은 숫자의 치역이고 정의역과 동일한 타입이 리턴되어야만합니다.
예를 들어 [1,2,3,4,5] 라는 배열을 flatmap 이라는 함수에 넣어서 [2,4,6,8,10] 가 반환됩니다.
이것은 모나드입니다.
하지만 [1,2,3,4,5] 이 [true,true,false,false,false] 라는 다른 타입이 리턴되면 이것은 펑터이지만 모나드가 아닙니다.
스위프트에서 Functor 와 Monad 는?
Set
위에 소스의 set 상수는 Set 타입입니다.
이러한 Set 타입도 Map 이 존재합니다.
Map 을 돌리면 {1,2,3,4,5} 집합 타입은 [2,4,6,8,10] Int 배열로 리턴됩니다.
이렇게 되면 같은 타입으로 리턴되지 않으므로 Set 타입은 Functor 이지만 Monad 는 아닙니다.
Dictionary
Dictionary 에도 Map 함수가 존재합니다.
하지만 리턴 값을 Dictionary 로 하지는 못합니다.
배열 타입으로 리턴이 가능하며 이런식으로 다른 타입으로 리턴되는 것은 Functor 입니다.
스위프트에서 Monad type 은?
Array
위에 소스에서 보시면 array 는 [1,2,3,4,5] 입니다.
map 에 의해서 [2,4,6,8,10] 으로 바뀔 수 있으므로 Functor 입니다.
map 에 의해서 다시 [1,2,3,4,5] 으로 돌아올 수 있으므로 Monad 입니다.
Optional
위에 소스에서 보시면 optional 변수는 옵셔널 Int 형입니다.
optional 에도 Map 은 존재합니다.
Map 을 통해 optional Int 형태의 2 로 바뀌었다가 다시 Optional Int 형의 1 로 돌아옵니다.
다시 돌아오므로 Monad 입니다.
정리
오늘은 Functor 와 Monad 에 대해서 알아봤습니다.
이러한 예제를 보셔서 이해하는데 도움이 됬으면 좋겠습니다.
읽어주셔서 감사합니다.