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

时间:2012-08-29 18:35:30

标签: scala parallel-processing monads functor applicative

来自Josh Suereth的“Scala in Depth”:

“Applicative functors提供了一种方法来进行两次计算并使用函数将它们连接在一起.Traversable示例突出显示了如何将两个集合并行化成对。应用函子和并行处理像面包和黄油一样。”

我对整个仿函数/ monads / applicative的东西有一个模糊的概念,但并不完全掌握它(对整个monad来说是新的,仿函数的东西)。我理解monads(flatten,flatMap)和monadic工作流以及functor(maps)的概念。

任何人都可以就它的完成方式,示例和/或优势与“传统”并行化方面的内容进行详细阐述吗?

1 个答案:

答案 0 :(得分:13)

我把问题转发给Josh Suereth。这是他的回复:

迈克 -

  

我没有太多时间回应,但我会提供一些例子   我的意思是:

     

示例#1 - 表单验证。

     

我想对输入和聚合所有运行一些验证   错误,即在 parallel 中检测它们。有应用功能我   可以这样做。

     

所以,给定一组“处理”函数,如下:

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 form将使用CreditCard / username +打印出错误   同时解决所有问题,因为你已经使用了一个来组合它们   应用仿函数。这是并行错误报告(尽管如此)   测试实际上并不是并行完成的。)

     

(2)期货

     

我想并行做一些事情并结合结果。期货   “zip”方法实际上是伪装的应用程序。我可以   这样:

Future(computation1) zip Future(computation2) map { case (one,two) => .... }
     

我刚刚使用Applicative Functors来“加入”并行计算   它与表单验证示例完全相同。

     

希望有所帮助!    - 乔希

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