Cats proporciona importaciones de sintaxis separadas para cada type class.
Se puede especificar exactamente qué instancia necesitamos. Sin embargo, esto no agrega valor en el código de producción. Es más simple y rápido usar las siguientes importaciones:
• import cats._ importa todas las clases de tipos de Cats de una sola vez;
• import cats.implicits._ importa todas las instancias de clase de tipo estándar y toda la sintaxis de una sola vez.
Podemos definir una instancia de Show simplemente implementando el trait :
import java.util.Date
implicit val dateShow: Show[Date] = new Show[Date] {
def show(date: Date): String = s"${date.getTime}ms since the epoch."
}
new Date().show
// res1: String = "1594650192117ms since the epoch."
Sin embargo, Cats también proporciona un par de métodos convenientes para simplificar el proceso. Hay dos métodos de construcción en el objeto complementario de Show que podemos usar para definir instancias para nuestros propios tipos:
object Show {
// Convert a function to a `Show` instance:
def show[A](f: A => String): Show[A] = ???
// Create a `Show` instance from a `toString` method:
def fromToString[A]: Show[A] = ???
}
Estos nos permiten construir instancias rápidamente con menos ceremonia que definirlas desde cero:
val implícito dateShow: Show[Date] = Show.show(date => s"${date.getTime}ms since the epoch.")
Como puede ver, el código que usa métodos de construcción es mucho más conciso que el código sin ellos. Muchas clases de tipos en Cats proporcionan métodos auxiliares como estos para construir instancias, ya sea desde cero o transformando instancias existentes para otros tipos.