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/