最佳答案
我知道 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))
...
现在我在 Scala 中看到了 Applicative Functor
:
trait Applicative[F[_]] {
def apply[A, B](f: F[A => B]): F[A] => F[B]
}
我不知道什么时候我应该使用它 而不是单子。我猜选项和列表都是 Applicatives
。你能举个简单的例子说明如何使用 apply
与选项和列表,并解释 为什么我应该使用它 而不是 flatMap
?