동기
- Monad를 규명하고 싶은자들에게 필수적인 내용을 담고 있다.
FlatMap의 Signature
- flatMap 함수하나를 포함하고 있다.
trait CustomFlatMap[M[_]] {
def flatMap[A, B](ma: M[A])(f: A => M[B]): M[B]
}
활용 For comprehension
import cats.FlatMap
import cats.syntax.flatMap._
import cats.syntax.functor._
def getPairs[M[_] : FlatMap](numbers: M[Int], chars: M[Char]): M[(Int, Char)] = for {
n <- numbers
c <- chars
} yield (n, c)
// Generalized
def getPairs[M[_] : FlatMap, A, B](ma: M[A], mb: M[B]): M[(A, B)] = for {
n <- ma
c <- mb
} yield (n, c)
타 Class와의 관계 규명
- Apply(Applicative)의 특성을 가진다.
- Apply에서 제공하는 map함수와 flatMap 함수를 조합하여 Apply.ap 함수를 구현할 수 있다.
trait MyFlatMap[M[_]] extends Apply[M] {
def flatMap[A, B](ma: M[A])(f: A => M[B]): M[B]
def ap[A, B](wf: M[A => B])(wa: M[A]): M[B] =
flatMap(wa)(a => map(wf)(f => f(a)))
}
Monad의 한 부분
- 아래와 같은 구조(pure, map, flatMap 조합)로 Monad의 완전체를 구현할 수 있다.
trait MyMonad[M[_]] extends Applicative[M] with CustomFlatMap[M] {
override def map[A, B](ma: M[A])(f: A=>B): M[B] =
flatMap(ma)(x => pure(f(x)))
}
Monad를 위한 정리
- 지금까지의 Type Class와 Monad는 아래와 같은 구조를 이룬다. (하위 Monad가 상위 모든 클래스의 특징을 가진다)
- StarUML은 Higher Kinded Type 표기를 지원하지 않아 Class Diagram상 함수명만 표기하였다.
'Tech > Scala' 카테고리의 다른 글
Functional Effect 정리 (1) | 2024.09.01 |
---|---|
함수형 프로그래밍 Type Classes: Applicative, Apply (0) | 2024.02.18 |
함수형 프로그래밍 Type Class : Semigroupal (1) | 2024.02.14 |
함수형 프로그래밍의 시작점(?), Free Monad in Scala (0) | 2023.10.13 |
함수형 프로그래밍의 Monad 개념 정리 (in Scala) (0) | 2022.12.20 |