9

JoshSuerethの「ScalainDepth」から:

「アプリケーションファンクターは、2つの計算を行い、関数を使用してそれらを結合する方法を提供します。トラバース可能な例は、2つのコレクションをペアに並列化する方法を示しています。アプリケーションファンクターと並列処理は、パンとバターのように連携します。」

私はファンクター/モナド/アプリケーション全体について漠然とした考えを持っていますが、それを正確に把握しているわけではありません(モナド全体、ファンクターのものは初めてです)。モナド(flatten、flatMap)とモナドワークフロー、およびファンクター(マップ)の概念を少し理解しています。

それがどのように行われるか、例、および/または「従来の」並列化と比較した場合の利点について、誰かが私のために詳しく説明してもらえますか?

4

1 に答える 1

13

質問を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とその適用対象を使用するライブラリを選択する必要があります)

于 2012-08-29T18:47:27.630 に答える