来自Josh Suereth的“Scala in Depth”:
“Applicative functors提供了一种方法来进行两次计算并使用函数将它们连接在一起.Traversable示例突出显示了如何将两个集合并行化成对。应用函子和并行处理像面包和黄油一样。”
我对整个仿函数/ monads / applicative的东西有一个模糊的概念,但并不完全掌握它(对整个monad来说是新的,仿函数的东西)。我理解monads(flatten,flatMap)和monadic工作流以及functor(maps)的概念。
任何人都可以就它的完成方式,示例和/或优势与“传统”并行化方面的内容进行详细阐述吗?
答案 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中的概念,因此您需要选择一个库来使用应用程序及其应用的内容)