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

ade*_*rtc 9 parallel-processing monads scala functor applicative

来自Josh Suereth的"Scala in Depth":

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

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

任何人都可以就它的完成方式,示例和/或优势与"传统"并行化方面的问题详细说明一下吗?

Mik*_*inn 13

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

迈克 -

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

示例#1 - 表单验证.

我想针对输入运行一些验证并聚合所有错误,即并行检测它们.有了应用功能,我可以这样做.

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

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
  } 
Run Code Online (Sandbox Code Playgroud)

现在,处理表单将同时打印出CreditCard/username +地址的错误,因为您已使用applicative functor将它们组合在一起.这是并行错误报告(尽管测试实际上并非并行完成).

(2)期货

我想并行做一些事情并结合结果.Future的"zip"方法实际上是伪装的应用程序.我可以做这个:

Future(computation1) zip Future(computation2) map { case (one,two) => .... }
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助! - 乔希

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