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: