Kotlin Functors, Applicatives, And Monads in Pictures. Part 3/3

오래 쉬었지만 마지막 3편 Monads에 대해 번역을 시작하겠습니다.

Applicative 관련된 내용은 아래 링크에서 확인 하시면 됩니다.

개인적으로 내용을 첨삭 했기 때문에 원문이 궁금하시면 아래 링크로 확인 바랍니다.

Monads

Functors는 래핑 된 값에 함수를 적용합니다.

Applicatives 래핑 된 값에 래핑 된 함수를 적용합니다.

Monad는 래핑 된 값을 래핑 된 값으로 만드는 함수에 적용합니다. Monad는 일반적으로 flatMap 이라는 함수로 표현됩니다.(하스켈, scala, kotlin 등등)

inline fun <B> flatMap(f: (A) -> Option<B>): Option<B> = 
when (this) {
is None -> this
is Some -> f(value)
}

예제를 통해 확인해보겠습니다.

일반적인 모나드의 형태입니다.

짝수만을 실행하는 half 함수를 만들어 보겠습니다.

fun half(a: Int) = when {
a % 2 == 0 -> Some(a / 2)
else -> None
}

래핑 된 값을 입력하면 어떻게 될까요?

래핑 된 값을 함수에 넣기 위해서는 flatMap (>>= in Haskell)함수를 사용해야 합니다.

다음은 작동 방식 입니다.

Some(3).flatMap(::half)
// None
Some(4).flatMap(::half)
// Some(2)
None.flatMap(::half)
// None

내부에서 어떤 일이 일어날까요? flatMap's (>>= in Haskell)의 시그니처를 다시 한번 보겠습니다.:

// For Option
inline fun <B> flatMap(f: (A) -> Option<B>): Option<B>

Option 은 모나드입니다. 예제에서는 Some(3) 을 사용합니다.

None 을 전달하면 더 간단합니다:

flatMap을 chain해서 사용 할 수도 있습니다.

Some(20) flatMap ::half flatMap ::half flatMap ::half
// => None
이 글의 원문은 원래 Haskell 의 원문을 Kotlin에 맞게 설명한 내용입니다. Haskell원문은 IO Monad를 사용해 설명하지만 Kotlin에는 없기 때문에 생략했다고 합니다.

정리

  1. Functor는 래핑 된 값에 함수를 적용하는 함수 map 의 유형을 말합니다.
  2. Applicative 는 래핑 된 값에 래핑 된 함수를 적용하는 함수 apply의 유형을 말합니다.
  3. Monad 는 래핑 된 값에 래핑 된 값을 반환 하는 함수 flatMap의 유형을 말합니다.
  4. OptionmapflatMap을 제공하며, map, flatMap확장을 통해 apply,를 구현 할수 있습니다. 따라서 Option은 functor, applicative, monad 라고 할 수 있씁니다.

3가지의 차이점을 다시 정리하겠습니다.

  • functors: map을 사용해 래핑된 값에 함수를 적용합니다.
  • applicatives: apply을 사용해 래핑된 값에 래핑된 함수를 적용합니다.
  • monads: flatMap을 사용해 래핑된 값에 래핑된 값을 반환 하는 함수를 적용합니다.

3편까지 번역을 마치겠습니다. 번역을 허락해준

님께 감사 드리고 공부하면서 정리한내용이기에 다소 어색하거나 잘못 된 내용이 있을 수 있는점 양해바랍니다. 궁금하신 점이나 수정사항이 있으면 언제든지 댓글, 메일로 연락주시면 감사하겠습니다.