Translate

lunes, 2 de mayo de 2022

¿Qué gano aprendiendo Cats?


Aprender Cats no es tan difícil, pero ¿por qué querría hacer eso?

Bueno, porque es realmente útil, solo importando cats.syntax.all._  tiene acceso a un montón de métodos de extensión que resuelven múltiples problemas comunes en una o un par de líneas; por ejemplo:

import cats.syntax.all._


// Combinar 2 mapas

m1 |+| m2


// Sumar el largo de todos los string de una lista

strings.foldMap(str => str.length)


// Aplicar una función, que devuelve una opción, a todos los elementos de una lista

// y devuelve el primero que se define.

ints.foldMapK(foo)


// Aplicar una función, que devuelve una opción, a todos los elementos de una lista

// y volver a recopilar todos los resultados si todos eran Some

ints.traverse(bar)


// Aplicar múltiples validaciones independientes

// y usamos los resultados para crear un type class,

// de lo contrario, acumula todos los errores en una colección no vacía.

(

  validationA(x).toEitherNec,

  validationB(y).toEitherNec,

  validationC(z).toEitherNec

).parMapN(Data.apply)


// Une dos listas de diferentes tamaños:

l1.aligWith(l2) {

  case Ior.both(a, b) => ???

  case Ior.left(a) => ???

  case Ior.right(b) => ???

}

Lo bueno de eso es que esas operaciones son muy generales, por lo que funcionan con múltiples tipos; también suelen componer, por lo que puedes usar las mismas operaciones para tipos más complejos.

Ahora, uno puede argumentar que puede implementarlos usando las funciones stdlib y generalmente puede hacerlo, de la misma manera que puede implementar stdlib usted mismo; el hecho de que esas operaciones ya existan es bueno.

Bueno, también puedes ver a cats como una biblioteca fundamental para construir aún más abstracciones, eso es básicamente lo que hacen bibliotecas como cats-effect y fs2; amplían las abstracciones de cats, además de otras cosas.

Entonces, puede escribir su propia función auxiliar que funcione para cualquier Mónada y estar seguro de que debería funcionar debido a las leyes y todo eso.

Pero, para ser justos, rara vez harás eso, así que no te preocupes demasiado por eso. La mayoría del uso de cats es simplemente importar cats.syntax.all._ y disfrutar de todos los métodos de extensión útiles, o usar estructuras de datos como cats.data.NonEmptychain

En conclusión, cats implementa un framework conceptual para la Programación Funcional, para clasificar combinadores básicos y derivados en una jerarquía de complejidad. 

Dejo link : https://typelevel.org/cats/