Translate

martes, 11 de octubre de 2022

Transformadores de mónadas en cats


Las mónadas son como los burritos, lo que significa que una vez que adquieres un sabor, te encontrarás regresando a ellas una y otra vez. Esto no está exento de problemas. Así como los burritos pueden inflar la cintura, las mónadas pueden inflar la base del código a través de comprensiones anidadas. Imagina que estamos interactuando con una base de datos. Queremos buscar un registro de usuario. El usuario puede estar presente o no, por lo que devolvemos un Option[User]. Nuestra comunicación con la base de datos podría fallar por muchas razones (problemas de red, problemas de autenticación, etc.), por lo que este resultado se envuelve en un Either, dándonos un resultado final de Either[Error, Option[User]]. Para usar este valor, debemos anidar llamadas flatMap (o de manera equivalente, para comprensiones):

def lookupUserName(id: Long): Either[Error, Option[String]] =

    for {

        optUser <- lookupUser(id)

    } yield {

        for { user <- optUser } yield user.name

   }


Cada transformador de mónadas es un tipo de datos, definido en cats.data, que nos permite envolver pilas de mónadas para producir nuevas mónadas. Usamos las mónadas que hemos construido a través de la clase de tipo Monad. Los principales conceptos que tenemos que cubrir para entender los transformadores de mónadas son:

  • las clases de transformadores disponibles;
  • cómo construir pilas de mónadas usando transformadores;
  • cómo construir instancias de una pila de mónadas; y
  • cómo separar una pila para acceder a las mónadas envueltas.
Continuará...