我知道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
它是一个 monad:
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]
}
我想知道什么时候应该使用它而不是monad 。我猜 Option 和 List 都是Applicatives
. 您能否给出使用apply
with Option 和 List 的简单示例,并解释为什么我应该使用它而不是 flatMap
?