相关疑难解决方法(0)

何时以及为什么要在Scala中使用Applicative Functors

我知道Monad可以在Scala中表达如下:

trait Monad[F[_]] {
  def flatMap[A, B](f: A => F[B]): F[A] => F[B]
}
Run Code Online (Sandbox Code Playgroud)

我明白为什么它有用.例如,给定两个功能:

getUserById(userId: Int): Option[User] = ...
getPhone(user: User): Option[Phone] = ...
Run Code Online (Sandbox Code Playgroud)

我可以轻松编写函数,getPhoneByUserId(userId: Int)因为它Option是一个monad:

def getPhoneByUserId(userId: Int): Option[Phone] = 
  getUserById(userId).flatMap(user => getPhone(user))
Run Code Online (Sandbox Code Playgroud)

...

现在我Applicative Functor在Scala中看到:

trait Applicative[F[_]] {
  def apply[A, B](f: F[A => B]): F[A] => F[B]
}
Run Code Online (Sandbox Code Playgroud)

我想知道何时应该使用它而不是 monad.我猜选项和列表都是Applicatives.你能给出使用applyOption和List的简单例子,并解释为什么我应该使用它而不是 flatMap

functional-programming scala applicative

65
推荐指数
2
解决办法
1万
查看次数

Monads VS期货的应用函子

假设我想从2个远程服务聚合数据,并尽可能快地提供响应:

def loadUser: Future[User]
def loadData: Future[Data]

case class Payload(user: User, data: Data)
Run Code Online (Sandbox Code Playgroud)

我知道这个顺序执行异步任务:

for {
  user <- loadUser
  data <- loadData
} yield Payload(user,data)
Run Code Online (Sandbox Code Playgroud)

虽然这个并行执行它们,因为异步任务在顺序链接之前被触发:

val userF = loadUser
val dataF = loadData
for {
  user <- userF 
  data <- dataF
} yield Payload(user,data)
Run Code Online (Sandbox Code Playgroud)

然而,差异对我来说有点过于含蓄,有些人可能最初没有注意到它.


申请人也解决了这个问题

(loadUser |@| loadData) { Payload(_,_) }
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我在应用程序和monad之间使用什么来执行并行异步计算吗?每种方法的优缺点是什么?

monads scala scalaz applicative scala-cats

18
推荐指数
1
解决办法
1415
查看次数