En programación funcional existen multiples herramientas para modelar problemas que los programadores necesitamos para dar soluciones a los problemas del negocio en el que nos manejemos, una de ellas son los tipos algebraicos, te invito a conocer, mediante una breve introducción con los tipos enumerativos y variantes, un poco más sobre este mundo...

Introducción

Recordando un poco sobre el post anterior, teníamos dos mundos, el mundo abstracto de las ideas, donde tenemos los números, boleanos, tuplas, funciones, etc y el mundo de las expresiones, que son las representaciones de esas ideas para que nosotros los humanos podamos utilizarlas. (Te recomiendo revisar el post anterior Conceptos Básicos de la Programación Funcional)

Representaciones

Ahora bien, supongamos que queremos modelar en programación funcional el mundo de los helados, acotado a las siguientes reglas:

  • Los helados pueden venir en vasito, cucurucho o pote y puede haber helados de varios gustos
  • En particular, los gustos son Chocolate, Vainilla, Dulce de Leche y Frutilla.
  • Hay restricciones
    • Los vasitos solo pueden tener un gustos
    • Los cucuruchos 2 gustos
    • Los potes 3 gustos

Utilizando lo que conocemos hasta ahora, que son los números, podríamos representarlo de la siguiente manera:

0 = Vacío
1 = Chocolate
2 = Vainilla
3 = Dulce de Leche
4 = Frutilla

Y representando los envases:

1 = Vasito
2 = Cucurucho
3 = Pote

Entonces, con esta definicion podríamos armar los siguientes helados utilizando tuplas para ello:

  1. (1,(1,0,0))
  2. (2,(3,4,0))
  3. (3,(2,1,4))

Traduciendo lo que representamos tendríamos:

  1. Un vasito de chocolate
  2. Un cucurucho de dulce de leche y frutilla
  3. Un pote de vainilla, chocolate y frutilla

Como primera contra de esta representación vemos que no es tan descriptiva, tenemos que estar mirando los números tanto para armar como para desifrar de que helado queremos hablar.

Como segunda contra tenemos los siguientes helados posibles:

  • (2, (23,12,0))
  • (66, (1,1,1))
  • (1,(2,2,2))

Donde si lo tratamos de traducir no tiene ningun sentido, ya que un cucurucho de 23 o 12 no sabemos que gusto es, un 66 no sabemos que recipiente es, o un vasito con tres gustos va en contra de nuestro negocio. Es decir esta representación nos permite crear cosas sin sentido pero que estarian bien escritas. No es lo que queremos.

Nuevos tipos

Para describir una nueva representación que se adapte a lo que necesitamos tenemos que tener más expresiones.
Para lograr esto necesitamos definir un tipo, dar expresiones atómicas para sus elementos y sobre todo mantener las propiedades de lo que ya existe.
Voy a utlizar Haskell para demostrar como se crea un tipo y expresiones atómicas nuevas en el lenguaje:

data Gusto = Chocolate | Vainilla | DulceDeLeche | Frutilla
data Helado = Vasito Gusto | Cucurucho Gusto Gusto | Pote Gusto Gusto Gusto

La palabra data es una keyword del lenguaje que me permite definir un tipo (Gusto, Helado) y separamos con pipes lo constructores que representan los valores que necesitamos. Ahora bien estos constructores pueden ser dos cosas, o expresiones atómicas como Chocolate, Vainilla, etc, o funciones, como Vasito Gusto, donde Gusto es una variable que puede tomar cualquier valor de los gustos definidos.

Igualmente más allá de poder ser una función tiene una caracterísca, a pesar de tener un argumento como Gusto sigue siendo una expresión atómica, es decir que no se puede reducir. Ejemplo:

  • Vasito Vainilla
  • Cucurucho Chocolate Frutilla
  • Pote DulceDeLeche Vainilla Frutilla

Comparando esta nueva representación con la anterior que habíamos definido a simple vista nos damos cuenta que es más descriptiva, que al definir el tipo de esta manera no podemos generar construcciones inválidas, ya que el sistema de tipos no me lo permitiría y no rompemos nada del lenguaje, todo funciona como venia funcionando e incluimos una idea nueva al mundo de los valores.

Para cerrar con el artículo te comento que existen varios tipos que se pueden construir con los tipos algebraicos, entre los más comúnes tenemos los tipos enumerativos (ej. Gusto), variantes o sumas (ej. Helado), producto o registro, recursivos estructurales, otros tipos combinando con otras características como orden superior o recursion general. Este artículo quiere ser una breve introducción a esta herramienta es por ello que te invito a que sigas investigando y te veo en próximos artículos sobre programación funcional. Muchas gracias por leer.

Mandanos tus sugerencias

Ayudanos con ideas para los artículos de este blog a contacto@somospnt.com

¡Seguínos en nuestras redes sociales para enterarte de los últimos posts!