Supponiamo che io voglio aggregare i dati da 2 servizi remoti, e servono la risposta più veloce che posso:funtori Monadi VS applicative per Futures
def loadUser: Future[User]
def loadData: Future[Data]
case class Payload(user: User, data: Data)
Capisco che questo esegue compiti asincroni in sequenza:
for {
user <- loadUser
data <- loadData
} yield Payload(user,data)
mentre questo li esegue in parallelo, perché le attività asincrone vengono attivati prima di essere in sequenza chaine d:
val userF = loadUser
val dataF = loadData
for {
user <- userF
data <- dataF
} yield Payload(user,data)
La differenza è comunque un po 'troppo implicita per me e qualcuno potrebbe non notarlo all'inizio.
applicativi risolve anche il lavoro
(loadUser |@| loadData) { Payload(_,_) }
Qualcuno può dirmi quello che io preferisco usare tra applicativi e monadi di eseguire in parallelo computazione asincrona? Quali sono i pro e i contro di ciascun approccio?
penso che fondamentalmente se hai bisogno dell'output di someComputationA per calcolare l'output di someComputationB usi una monade. Se vuoi solo calcolare due cose separate e combinarle, lo farà l'applicativo. Sebbene questo non sia niente di specificamente "parallelo" rispetto agli applicativi, direi che, per le ragioni sopra esposte, le monadi sono intrinsecamente sequenziali. Qui, se hai bisogno di calcoli veramente paralleli, le monadi probabilmente non sono la struttura che stai cercando. * waves hands * – melps
La mia risposta [qui] (http://stackoverflow.com/a/19881777/334519) ha alcune discussioni rilevanti. –
L'idioma standard per eseguire calcoli 'Future' in parallelo è' zip': 'for ((utente, dati) <- loadUser zip loadData) yield Payload (utente, dati)' – Kolmar