9

来自 Josh Suereth 的“Scala in Depth”:

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

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

任何人都可以详细说明它是如何完成的、示例和/或它与“传统”并行化相比的好处吗?

4

1 回答 1

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
  } 

现在处理表单将同时打印出带有 CreditCard/用户名 + 地址的错误,因为您已经使用应用函子将它们组合在一起。那是并行错误报告(尽管测试实际上并不是并行完成的)。

(2) 期货

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

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

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

希望有帮助!- 乔什

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

于 2012-08-29T18:47:27.630 回答