Я знаю, что 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?