Я знаю, что Monad
может быть выражен в Scala следующим образом:
trait Monad[F[_]] {
def flatMap[A, B](f: A => F[B]): F[A] => F[B]
}
Я понимаю, почему это полезно. Например, с учетом двух функций:
getUserById(userId: Int): Option[User] = ...
getPhone(user: User): Option[Phone] = ...
Я могу легко написать функцию getPhoneByUserId(userId: Int)
, так как Option
является монадой:
def getPhoneByUserId(userId: Int): Option[Phone] =
getUserById(userId).flatMap(user => getPhone(user))
...
Теперь я вижу Applicative Functor
в Scala:
trait Applicative[F[_]] {
def apply[A, B](f: F[A => B]): F[A] => F[B]
}
Интересно, когда я должен использовать его вместо монады. Я думаю, что оба варианта и списка Applicatives
. Не могли бы вы привести простые примеры использования apply
с опцией и списком и объяснить, почему я должен использовать его вместо flatMap
?