Когда и почему следует использовать Аппликативные Функторы в Scala
я знаю это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
в Скале:
trait Applicative[F[_]] {
def apply[A, B](f: F[A => B]): F[A] => F[B]
}
Интересно, когда я должен использовать этовместо монада Я думаю, что и Option и ListApplicatives
, Не могли бы вы привести простые примеры использованияapply
с опцией и список и объяснитьПочему Я должен использовать этовместо flatMap
?