Functor and Monad

2019-07-21
Terminology

안녕하세요. 도미닉입니다.

오늘은 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 에 대해서 알아봤습니다.

이러한 예제를 보셔서 이해하는데 도움이 됬으면 좋겠습니다.

읽어주셔서 감사합니다.