Scala 应用函子如何与并行化算法相结合?(斯卡拉和斯卡拉兹)

Scala 应用函子如何与并行化算法相结合?(斯卡拉和斯卡拉兹),scala,parallel-processing,monads,functor,applicative,Scala,Parallel Processing,Monads,Functor,Applicative,来自Josh Suereth的“深度Scala”: “应用程序函子提供了一种方法,可以进行两次计算,并使用一个函数将它们连接在一起。可遍历示例强调了如何将两个集合并行化成对。应用程序函子和并行处理就像面包和黄油一样。” 我对整个functor/monad/applicative的东西有一个模糊的概念,但对它的理解不是很强(对于整个monad,functor的东西来说是新的)。我了解一些单子(展平,平面映射)和单子工作流以及函子(映射)的概念 有谁能为我详细说明一下它是如何实现的、示例和/或它相对

来自Josh Suereth的“深度Scala”:

“应用程序函子提供了一种方法,可以进行两次计算,并使用一个函数将它们连接在一起。可遍历示例强调了如何将两个集合并行化成对。应用程序函子和并行处理就像面包和黄油一样。”

我对整个functor/monad/applicative的东西有一个模糊的概念,但对它的理解不是很强(对于整个monad,functor的东西来说是新的)。我了解一些单子(展平,平面映射)和单子工作流以及函子(映射)的概念


有谁能为我详细说明一下它是如何实现的、示例和/或它相对于“传统”并行化的好处吗?

我把这个问题转发给了Josh Suereth。以下是他的答复:

迈克-

我没有太多的时间来回答,但我会举一些例子 我的意思是:

示例#1-表单验证

我想对输入运行一些验证并聚合所有 错误,即并行检测错误。具有应用功能的I 我可以这样做

因此,给定一组“处理”函数,如下所示:

def processUser(data: Data): Validation[User] = {
  if (data get "username" isEmpty) Failure("username must not be empty")
  else {  
     val Some(user) = data get "username"
     if (user contains badCharacterRegex) Failure(s"username must not contain one of ${badchars}")
     else Success(user)
  }
}
def processCreditCard(data: Data): Validation[CreditCard] = ...
def processAddress(data: Data): Validation[Address] = ...

def handleForm(data: Data): ??? = {
  (processUser(data), processCreditCard(data), processAddress(data)) map { (user, card, address) =>
    postPayment(user, address, card)
  } recover {   (errors) =>
     errors foreach println
  } 
现在handle表单将打印出带有信用卡/用户名的错误+ 同时解决所有问题,因为您已使用 应用函子。这是并行错误报告(尽管 测试实际上不是并行进行的)

(2) 未来

我想并行地做一些事情,并结合结果。未来的 “zip”方法实际上是一个伪装的应用函子。我能行 这:

我刚刚使用了应用函子来“连接”并行计算。
它与表单验证示例完全相同

希望有帮助! -乔希


(请注意,这些代码片段是不可编译的示例;我在Scalaz中使用了SBT的应用程序语法,因此您需要选择一个库来使用应用程序及其应用对象)

我尝试了(processX,processY,processZ)映射{(x,y,z)=>…},但它没有为我编译。scalaz7的一个特性是有这个TupleX[Validation,…]的映射吗?我认为Josh根本不是指scalaz。我会指给他看这个帖子。是的,我的帖子更基本,不是针对Scalaz的。我在Scalaz中使用SBT的应用程序语法和概念。这里有一个体面的介绍:我有一个例子
Future(computation1) zip Future(computation2) map { case (one,two) => .... }