Angenommen, ich Daten von 2 Remote-Dienste aggregieren möchten, und Reaktion dienen, so schnell wie ich kann:Monaden VS Applicative functors für Futures
def loadUser: Future[User]
def loadData: Future[Data]
case class Payload(user: User, data: Data)
Ich verstehe, dass dies eine der Reihe nach async Aufgaben ausführt:
for {
user <- loadUser
data <- loadData
} yield Payload(user,data)
Während diese man sie parallel ausführt, weil async Aufgaben bevor sequentiell wobei chaine ausgelöst werden d:
val userF = loadUser
val dataF = loadData
for {
user <- userF
data <- dataF
} yield Payload(user,data)
Der Unterschied ist jedoch ein bisschen zu implizit für mich und jemand kann es nicht auf den ersten bemerken.
applicatives löst auch das Job
(loadUser |@| loadData) { Payload(_,_) }
Kann mir jemand sagen, was ich eher zwischen applicatives und Monaden verwenden würde parallel async Berechnung durchführen? Was sind die Vor- und Nachteile jedes Ansatzes?
Ich denke, dass grundsätzlich, wenn Sie die Ausgabe von etwasComputationA benötigen, um die Ausgabe von etwasComputationB zu berechnen, benutzen Sie eine Monade. Wenn Sie nur zwei verschiedene Dinge berechnen und kombinieren wollen, ist die Anwendung sinnvoll. Während dies bei Anwendungen nicht speziell parallel ist, würde ich argumentieren, dass Monaden aus den oben genannten Gründen inhärent sequenziell sind. Wenn Sie wirklich parallele Berechnungen benötigen, sind Monaden wahrscheinlich nicht die Struktur, nach der Sie suchen. * Wellenhände * – melps
Meine Antwort [hier] (http://stackoverflow.com/a/19881777/334519) hat einige relevante Diskussion. –
Standardsprache für 'Future' Berechnungen parallel ist' zip': 'für ((Benutzer, Daten) <- LoadUser Zip LoadData) Ausbeute Payload (Benutzer, Daten)' – Kolmar