Translate

lunes, 7 de marzo de 2022

Empezando con Cats


Cats está escrito usando una estructura modular que nos permite elegir qué class type, instancias y métodos de interfaz queremos usar. Echemos un primer vistazo usando cats.Show como ejemplo.

Show proporciona un mecanismo para producir una salida de consola amigable para los desarrolladores sin usar toString. Aquí hay una definición abreviada:

package cats

trait Show[A] {

def show(value: A): String

}

Los type classes en Cats se definen en el paquete cats. Podemos importar Show directamente desde este paquete:

import cats.Show

El objeto complementario de cada clase de tipo Cats tiene un método de aplicación que localiza una instancia para cualquier tipo que especifiquemos:

val showInt = Show.apply[Int]
// error: could not find implicit value for parameter instance: cats.Show[Int]
// val showInt: Show[Int] = Show.apply[Int]
//
 ^^^^^^^^^^^^^^^

Vaya, ¡eso no funcionó! El método apply utiliza implícitos para buscar instancias individuales, por lo que tendremos que incluir algunas instancias en el alcance.

El paquete cats.instances proporciona instancias predeterminadas para una amplia variedad de tipos. Podemos importarlos como se muestra en la siguiente tabla. Cada importación proporciona
instancias de todas las clases de tipos de Cats para un tipo de parámetro específico:

cats.instances.int proporciona instancias para Int
cats.instances.string proporciona instancias para String
cats.instances.list proporciona instancias para List
cats.instances.option proporciona instancias para Option
cats.instances.all proporciona todas las instancias que se envían listas para usar con Cats

Importemos las instancias de Show para Int y String:

import cats.instances.int._ // for Show
import cats.instances.string._ // for Show

val showInt: Show[Int] = Show.apply[Int]
val showString: Show[String] = Show.apply[String]

Ahora tenemos acceso a dos instancias de Show y podemos usarlas para imprimir Ints y Strings:

val intAsString: String = showInt.show(123)

// intAsString: String = "123"

val stringAsString: String = showString.show("abc")

// stringAsString: String = "abc"