En la presente entrada, Scalaz IX: Mónada Reader, realizaré una descripción de ciertos tipos de funciones y abstracciones hasta llegar a definir una Monada de lectura o Mónada Reader, mónada que permite un parámetro de entrada.
En lenguaje Scala, una función se puede definir como una variable; esta función, es traducida como una clase. En el siguiente ejemplo, se definen las funciones f1 y f2 como variables y se muestra un ejemplo de uso. Con Scalaz, estas funciones se pueden interpretar como functores, con lo cual, podemos concatenar llamadas a dichas funciones con la función map. Esta situación, nos permite ejecutar una secuencia de funciones con un parámetro de entrada.
import scalaz.Scalaz._ val f1 = (_: Int) * 2 val f2 = (_: Int) + 10 println(s"f1(2)=${f1(2)}") println println(s"f2(2)=${f2(2)}") println println(s" (f1 map f2)(2)=${(f1 map f2) (2)} ") // Función map como functor println
La salida por consola es la siguiente:
f1(2)=4 f2(2)=12 (f1 map f2)(2)=14
Como observamos en el ejemplo anterior, podemos definir una parametro de lectura identificando el tipo de entrada, en concreto, un valor de tipo entero.
Las funciones de tipo Applicative, nos permite ejecutar varias funciones y, una vez ejecutadas, realizar un cálculo con los resultados de las aplicaciones. En el siguiente ejemplo, muestro un ejemplo de una función applicative en donde se ejecutan dos funciones (f1 y f2) y sus resultado son sumados.
import scalaz.Scalaz._ val f1Applicative = ({ (_: Int) * 2 } |@| { (_: Int) + 10 }) (_ + _) println(s"f1Applicative(2)=${f1Applicative(2)}") println
La salida por consola es la siguiente:
f1Applicative(2)=16
Como observamos en el ejemplo anterior, podemos definir una parametro de lectura identificando el tipo de entrada, en concreto, un valor de tipo entero.
Para finalizar, podemos definir una mónada, representado con un for comprehension, que define dos cálculos: el primero, la multiplicación de un tipo entero por dos; el segundo, la suma de un valor entero mas 10; y, para finalizar, la suma de su resultado. El código de ejemplo es el siguiente:
import scalaz.Scalaz._ val f1Monada: Int => Int = for { a <- (_: Int) * 2 b <- (_: Int) + 10 } yield { a + b } println(s"f1Monada=${f1Monada(2)}") println
La salida por consola es la siguiente:
f1Monada=16
Como observamos en el ejemplo anterior, podemos definir una mónada con un valor de entrada especificando su tipo. Así, podemos interpretar que una mónada es de lectura porque podemos definir valores de entrada.
Para el lector interesado, las entradas que he realizado sobre Scalaz hasta la fecha son las siguientes:
- Scalaz I: Functores y funciones como functores
- Scalaz II: type class básicos
- Scalaz III: Apply y Applicative
- Scalaz IV: Tipos etiquetados, propiedad asociativa y monoides
- Scalaz V: introducción a Mónadas
- Scalaz VI: continuación de mónadas
- Scala VII: leyes matemáticas de las mónadas
- Scalaz VIII: Construcción de funciones con parámetros con Applicative