2012-08-29 14 views
8

Von Josh Suereth der „Scala in Depth“:Wie verbinden sich anwendungsbezogene Funktoren mit Parallelisierungsalgorithmen? (Scala und Scalaz)

„Applicative functors bieten eine Möglichkeit, zwei Berechnungen zu nehmen und kommen sie zusammen eine Funktion mit dem Travers Beispiel zeigt, wie zwei Sammlungen in Paare parallelisiert werden können. Applikative Funktoren und Parallelverarbeitung gehen zusammen wie Brot und Butter. "

Ich habe eine vage Vorstellung von den ganzen Funktoren/Monaden/Anwendungen, aber nicht gerade ein starkes Verständnis davon (neu für die ganze Monade, Funktor Zeug). Ich verstehe ein wenig das Konzept von Monaden (flatten, flatMap) und monadischen Workflow und Funktoren (Karten).

Kann jemand bitte für mich in Bezug darauf, wie es getan wird, Beispiele und/oder Vorteile davon gegenüber "traditionellen" Parallelisierung erarbeiten?

+0

Ich habe ein Beispiel in [meine Folien] (https://docs.google.com/presentation/d/1iiTmrGkc7lZHcrgQOQ1xfro82BvFOqoVSnhH-HdWPx4/present#slide=id.p) –

Antwort

12

Ich leitete die Frage an Josh Suereth weiter. Dies ist seine Antwort:

Mike -

ich nicht viel Zeit haben zu reagieren, aber ich werde auf Beispiele von bieten, was ich meine:

Beispiel # 1 - Formularüberprüfung

Ich möchte einige Validierung gegen Ein- und Aggregat alle die Fehler laufen, das heißt sie aufgespürt in parallel. Mit anwendungsspezifischen Funktionen kann ich dies tun .

So ein Satz von „Verarbeitung“ Funktionen gegeben, etwa so:

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 
    } 

Jetzt Formular ausdrucken behandelt Fehler mit Creditcard/username + Adresse alle zur gleichen Zeit, da Sie kombiniert haben sie verwenden einen anwendungsspezifischen Funktor. Das ist paralleler Fehlerbericht (obwohl Tests nicht tatsächlich parallel durchgeführt werden).

(2) Futures

Ich möchte ein paar Dinge parallel zu tun, und die Ergebnisse zu kombinieren. Futures "Zip" -Methode ist eigentlich ein applicative Functor in Verkleidung. Ich kann dies tun:

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

Ich habe gerade Applicative Funktoren verwendet, um parallele Berechnungen „Join“.
Es entspricht genau dem Formularüberprüfungsbeispiel.

Hoffe, dass hilft! - Josh

(beachten Sie diese Code-Schnipsel sind nicht übersetzbare Beispiele, ich war in Scalaz SBT applicative Syntax mit den Konzepten, so dass Sie eine Bibliothek wählen müssen applicatives verwenden und was sie auf sich bewerben)

+0

Ich habe versucht, die (processX, processY, processZ) Karte {(x, y, z) => ...}, aber es kompiliert nicht für mich.Ist es eine Eigenschaft von scalaz7, diese Zuordnung von TupleX [Validation, ...] zu haben? –

+0

Ich glaube nicht, dass Josh sich auf Scalaz bezogen hat. Ich werde ihn auf diesen Thread hinweisen. –

+1

Ja, mein Beitrag ist einfacher, nicht spezifisch für Scalaz. Ich benutzte die anwendungsspezifische Syntax von SBT mit den Konzepten von Scalaz. Hier ist eine anständige Einführung: https://github.com/bartschuller/scalaz-validation-example – jsuereth