Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 单子与未来的应用函子_Scala_Monads_Scalaz_Applicative_Scala Cats - Fatal编程技术网

Scala 单子与未来的应用函子

Scala 单子与未来的应用函子,scala,monads,scalaz,applicative,scala-cats,Scala,Monads,Scalaz,Applicative,Scala Cats,假设我希望聚合来自2个远程服务的数据,并尽可能快地提供响应: def loadUser: Future[User] def loadData: Future[Data] case class Payload(user: User, data: Data) 我知道这一个按顺序执行异步任务: for { user <- loadUser data <- loadData } yield Payload(user,data) 有人能告诉我我更愿意在应用程序和monad之间使

假设我希望聚合来自2个远程服务的数据,并尽可能快地提供响应:

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

case class Payload(user: User, data: Data)

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

for {
  user <- loadUser
  data <- loadData
} yield Payload(user,data)

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

因此,我回答我自己的问题,因为所有评论都链接到有用的资源

特拉维斯·布朗有一个不错的选择:

使用最不强大的抽象来完成工作,这只是一种可靠的开发实践。原则上,这可能允许进行不可能的优化,但更重要的是,它使我们编写的代码更加可重用

他还指出了一个有趣的事实:

令人遗憾的是,Haskell和Scala目前都使使用单子比使用应用程序函子方便得多(语法等)

Kolmar指出,有可能压缩2个期货:

for ((user, data) <- loadUser zip loadData) yield Payload(user, data)

((用户、数据)的
我认为从根本上说,如果你需要someComputationA的输出来计算someComputationB的输出,你就需要使用monad。如果你只想计算两个独立的东西并将它们组合起来,applicative就可以了。虽然这对于applications来说并不是特别的“并行”,但我认为基于上面给出的原因,monad ar如果你需要真正的并行计算,monad可能不是你想要的结构。我的答案有一些相关的讨论。并行运行
未来
计算的标准习惯用法是
zip
对于((用户,数据)你可能会发现这很有用。
(loadUser |@| loadData) { Payload(_,_) }
for ((user, data) <- loadUser zip loadData) yield Payload(user, data)