【问题标题】:How do applicative functors tie in with parallelizing algorithms? (Scala and Scalaz)应用函子如何与并行算法联系起来? (斯卡拉和斯卡拉兹)
【发布时间】:2012-08-24 10:38:30
【问题描述】:

来自 Josh Suereth 的“Scala in Depth”:

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

我对整个 functors/monads/applicative 的东西有一个模糊的概念,但并没有完全掌握它(整个 monad、functor 的东西都是新手)。我对 monad(flatten、flatMap)和 monadic 工作流程以及仿函数(maps)的概念有所了解。

谁能为我详细说明它是如何完成的、示例和/或它与“传统”并行化相比的好处?

【问题讨论】:

标签: scala parallel-processing monads functor applicative


【解决方案1】:

我将问题转发给了 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
  } 

现在处理表单将打印出 CreditCard/username + 的错误 同时解决所有问题,因为您已使用 应用函子。这是并行错误报告(虽然 测试实际上并不是并行进行的)。

(2) 期货

我想并行做一些事情并结合结果。期货 “zip”方法实际上是一个变相的应用函子。我可以 这个:

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

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

希望对您有所帮助! - 乔什

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

【讨论】:

  • 我尝试了 (processX, processY, processZ) map { (x, y, z) => ... } 但它没有为我编译。 TupleX[Validation, ...]的这种映射是scalaz7的一个特性吗?
  • 我认为 Josh 根本不是指 scalaz。我会把他指向这个线程。
  • 是的,我的帖子更基本,不是专门针对 Scalaz。我将 SBT 的应用语法与 Scalaz 中的概念结合使用。这是一个不错的介绍:github.com/bartschuller/scalaz-validation-example
猜你喜欢
  • 2011-09-16
  • 1970-01-01
  • 2011-12-29
  • 2017-10-23
  • 1970-01-01
  • 2011-01-22
  • 2011-07-15
  • 2016-01-31
  • 1970-01-01
相关资源
最近更新 更多