我知道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
Option和List并解释为什么我应该使用它而不是 flatMap
?