scala monads scalaz applicative scala-cats

scala - Mónadas VS Functors aplicativos para futuros.



monads scalaz (1)

Supongamos que quiero agregar datos de 2 servicios remotos y brindar respuesta lo más rápido posible:

def loadUser: Future[User] def loadData: Future[Data] case class Payload(user: User, data: Data)

Entiendo que este ejecuta tareas asíncronas secuencialmente:

for { user <- loadUser data <- loadData } yield Payload(user,data)

Mientras éste los ejecuta en paralelo porque las tareas asíncronas se activan antes de ser encadenadas secuencialmente:

val userF = loadUser val dataF = loadData for { user <- userF data <- dataF } yield Payload(user,data)

Sin embargo, la diferencia es un poco demasiado implícita para mí y es posible que alguien no lo note al principio.

Los aplicativos también resuelven el trabajo.

(loadUser |@| loadData) { Payload(_,_) }

¿Puede alguien decirme qué prefiero usar entre los aplicativos y las mónadas para realizar cálculos asíncronos paralelos? ¿Cuáles son los pros y los contras de cada enfoque?


Entonces, estoy respondiendo mi propia pregunta porque todos los comentarios se vinculan con recursos útiles.

Travis Brown tuvo una buena answer :

Es solo una práctica de desarrollo sólida utilizar la abstracción menos poderosa que hará el trabajo. En principio, esto puede permitir optimizaciones que de otro modo no serían posibles, pero lo más importante es que hace que el código que escribimos sea más reutilizable.

También señala un dato interesante:

Es una pena que tanto Haskell como Scala hagan que trabajar con mónadas sea mucho más conveniente (sintácticamente, etc.) que trabajar con funtores aplicativos.

Kolmar señaló que es posible comprimir 2 futuros:

for ((user, data) <- loadUser zip loadData) yield Payload(user, data)

Sin embargo, parece que comprimir más de 2 futuros no es tan elegante.

Así que parece que el functor Applicative es el más adecuado para el trabajo, pero la biblioteca estándar de Scala no nos anima a usarlos en comparación con la mónada, y necesita una biblioteca adicional como Scalaz o Cats