En la preente entrada, Scalaz II: Básico, me centraré en las types classes de Scalaz con un funcionamiento básico; como son las type classes: Equal, Show y Enum.
Scalaz Equal
La type classes Equal define funciones para realizar comparaciones. Para utilizar el API Equal, hay que importar el API y la sintaxis de Scalaz de la siguiente forma:
import scalaz.Equal import scalaz.Scalaz._
Tipos básicos
Unos ejemplos de comparaciones con tipos básicos son los siguientes:
println(s"1 === 1=>${1 === 1}") println(s"1 === 'algo'=>${ 1 == "algo" }") println(s"1.some =/= 2.some=>${1.some =/= 2.some}") println(s"1 assert_=== 1=>${1 assert_=== 1}")
La salida por consola del snippet anterior es el siguiente:
1 === 1=>true 1 === 'algo'=>false 1.some =/= 2.some=>true 1 assert_=== 1=>()
Ejemplos con case class
Sea una case class para definir una entidad de negocio cualquiera y unas instancias de dicha case class definidas de la siguiente forma:
case class LuzDeTrafico(nobre: String) val rojo = LuzDeTrafico("rojo") val amarillo = LuzDeTrafico("amarillo") val verde = LuzDeTrafico("verde")
Sea una referencia implícita que define una operación con el API Equal con la case class anterior:
implicit val TrafficLightEqual: Equal[LuzDeTrafico] = Equal.equal(_ == _)
Se puede definir operaciones de comparación de la siguiente forma:
println(s"rojo === rojo?${rojo === rojo}") println(s"rojo === amarillo?${rojo === amarillo}")
La salida por consola del snippet anterior es el siguiente:
rojo === rojo?true rojo === amarillo?false
Scalaz Show
La type classes Show permite definir estructuras de datos como String. Los siguientes ejemplos muestran las funciones del API Show:
println(s"3.show=>${3.show}") println(s"3.shows=>${3.shows}") "Saludos a la consola".println println(s"Saludos a la consola con show=>${ "Saludos a la consola con show".show}")
La salida por consola del snippet anterior es el siguiente:
3.show=>3 3.shows=>3 "Saludos a la consola" Saludos a la consola con show=>"Saludos a la consola con show"
Scalaz Enum
La type class Enum permite definir estructuras secuenciales ordenadas. Las estructuras que podemos definir son las siguientes: lista de enteros, Streams de enteros y lista de caracteres. Unos snippet de ejemplo son los siguientes:
- Definición de un rango desde los caracteres ‘a’ hasta ‘e’
val enum1 = 'a' to 'e' println(s"'a' to 'e'=>${enum1}") println("Impresión del rango de enum1") enum1.foreach(println(_)) println
La salida por la consola es la siguiente:
'a' to 'e'=>NumericRange a to e Impresión del rango de enum1 a b c d e
- Definición de una lista con los elementos desde el caracter ‘a’ hasta ‘e’ y una lista de enteros desde 1 hasta 20.
val enum2 = 'a' |-> 'e' println(s"enum2=>${enum2}") val enum2_1 = 1 |-> 20 println(s"enum2_1=>${enum2_1}")
La salida por la consola es la siguiente:
enum2=>List(a, b, c, d, e) enum2_1=>List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
- Definición de un Stream de enteros con los elementos comprendidos desde el valor 3 hasta 5.
val enum3 = 3 |=> 5 println(s"emun3=>${enum3}") println(s"emun3=>${enum3.headOption}")
La salida por la consola es la siguiente:
emun3=>scalaz.EphemeralStream$$anon$5@37e547da emun3=>Some(3)
Para el lector interesado, las entradas que he realizado sobre Scalaz son las siguientes: