Quando e por que devemos usar os Applicative Functors em Scala?

Eu sei dissoMonad pode ser expresso em Scala da seguinte forma:

trait Monad[F[_]] {
  def flatMap[A, B](f: A => F[B]): F[A] => F[B]
}

Eu vejo porque é útil. Por exemplo, dadas duas funções:

getUserById(userId: Int): Option[User] = ...
getPhone(user: User): Option[Phone] = ...

Eu posso escrever facilmente a funçãogetPhoneByUserId(userId: Int) Desde aOption é uma mônada:

def getPhoneByUserId(userId: Int): Option[Phone] = 
  getUserById(userId).flatMap(user => getPhone(user))

...

Agora eu vejoApplicative Functor em Scala:

trait Applicative[F[_]] {
  def apply[A, B](f: F[A => B]): F[A] => F[B]
}

Eu me pergunto quando devo usá-loao invés de mônada. Eu acho que tanto Opção e Lista sãoApplicatives. Você poderia dar exemplos simples de usarapply com Option e List e expliqueporque Eu deveria usá-loao invés de flatMap ?

questionAnswers(2)

yourAnswerToTheQuestion