質問をJoshSuerethに転送しました。これは彼の返事です:
マイク-
返答する時間はあまりありませんが、私が言っていることの例を紹介します。
例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
}
アプリケーションファンクターを使用してエラーを組み合わせたため、ハンドルフォームはクレジットカード/ユーザー名+アドレスのエラーをすべて同時に出力します。これは並列エラー報告です(ただし、テストは実際には並列で実行されません)。
(2)先物
いくつかのことを並行して行い、結果を組み合わせたいと思います。Futureの「zip」メソッドは、実際には変装したアプリケーションファンクターです。私がすることができます:
Future(computation1) zip Future(computation2) map { case (one,two) => .... }
Applicative Functorsを使用して、並列計算を「結合」しました。
フォーム検証の例とまったく同じです。
お役に立てば幸いです。-ジョシュ
(これらのコードスニペットはコンパイルできない例であることに注意してください。Scalazの概念でSBTのApplicative構文を使用していたため、Applicativeとその適用対象を使用するライブラリを選択する必要があります)