我将问题转发给了 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 中的概念,因此您需要选择一个库来使用应用程序及其应用对象)