Translate

miércoles, 14 de febrero de 2024

Tuplas en Erlang


Una tupla es una forma de organizar datos. Es una forma de agrupar muchos términos cuando sabes cuántos hay. En Erlang, una tupla se escribe en la forma {Elemento1, Elemento2,..., ElementoN}. Como ejemplo, me darías las coordenadas (x,y) si quisieras decirme la posición de un punto en una gráfica cartesiana. Podemos representar este punto como una tupla de dos términos:

1> X = 10, Y = 4.

4

2> Point = {X,Y}.

{10,4}


En este caso, un punto siempre serán dos términos. En lugar de llevar las variables X e Y por todos lados, solo tienes que llevar una. Sin embargo, ¿qué puedo hacer si recibo un punto y sólo quiero la coordenada X? No es difícil extraer esa información. Recuerde que cuando asignamos valores, Erlang nunca se quejaría si fueran iguales. 

3> Point = {4,5}.

{4,5}

4> {X,Y} = Point.

{4,5}

5> X.

4

6> {X,_} = Point.

{4,5}


Ahora podemos usar X con el valor. Primero, X e Y no tenían valor y, por lo tanto, se consideraban variables independientes. Cuando los configuramos en la tupla {X,Y} en el lado izquierdo del operador =, el operador = compara ambos valores: {X,Y} vs. {4,5}. Erlang es lo suficientemente inteligente como para descomprimir los valores de la tupla y distribuirlos a las variables independientes en el lado izquierdo. Entonces la comparación es solo {4,5} = {4,5}, ¡lo cual obviamente tiene éxito! Esa es una de las muchas formas de coincidencia de patrones.

En la expresión 6, se utilizo la variable _ anónima y se usa cuando no queremos ese valor. La variable _ siempre se considera independiente y actúa como comodín para la coincidencia de patrones. La coincidencia de patrones para descomprimir tuplas solo funcionará si el número de elementos (la longitud de la tupla) es el mismo.


7> {_,_} = {4,5}.

{4,5}

8> {_,_} = {4,5,6}.

** exception error: no match of right hand side value {4,5,6}


Las tuplas también pueden resultar útiles cuando se trabaja con valores únicos. ¿Cómo es eso? El ejemplo más simple es la temperatura:


9> Temperature = 23.213.

23.213

Bueno, parece un buen día para ir a la playa... Espera, ¿esta temperatura está en Kelvin, Celsius o Fahrenheit?


10> PreciseTemperature = {celsius, 23.213}.

{celsius,23.213}

11> {kelvin, T} = PreciseTemperature.

** exception error: no match of right hand side value {celsius,23.213}


Esto arroja un error, ¡pero es exactamente lo que queremos! Esto es, nuevamente, coincidencia de patrones en acción. El operador = termina comparando {kelvin, T} y {celsius, 23.213}: incluso si la variable T no está unida, Erlang no verá el átomo celsius como idéntico al átomo kelvin al compararlos. Se lanza una excepción que detiene la ejecución del código. Al hacerlo, la parte de nuestro programa que espera una temperatura en Kelvin no podrá procesar las temperaturas enviadas en Celsius. Esto hace que sea más fácil para el programador saber qué se envía y también funciona como ayuda de depuración. Una tupla que contiene un átomo seguido de un elemento se denomina "tupla etiquetada". Cualquier elemento de una tupla puede ser de cualquier tipo, incluso de otra tupla:


12> {point, {X,Y}}.

{point,{4,5}}