Translate

domingo, 27 de septiembre de 2020

Ecuaciones en Haskell


Para los que venimos de otros lenguajes, tenemos que saber que no hay ecuaciones en lenguajes imperativos. En Haskell las ecuaciones se utilizan para dar nombre a los valores.

respuesta = 42

Una ecuación en Haskell es una ecuación matemática: dice que el lado izquierdo y el lado derecho denotan el mismo valor.

El lado izquierdo debe ser un nombre al que le esté dando un valor. Por ejemplo : 

   x = 5 * y

No podemos escribir ecuaciones como lo hacemos en la matemática, por ejemplo esto esta mal : 

   2 * x = (3 * x) ** 2 - No se permite la reasignación en un FPL puro

Las ecuaciones no son asignaciones y una variable o nombre solo puede tener un valor. Puse variable o nombre dado que los nombres a menudo se denominan "variables", pero no varían. ¡Las variables son constantes!

    n = 1 

    x = 3 * n 

    n = x   -- Error: solo puede tener una definición de n

Una vez que le da un valor a un nombre, ¡nunca podrá cambiarlo! Esto es parte del significado de "puro" y "sin efectos secundarios"

¿Qué pasa con n = n + 1? En lenguajes imperativos, frecuentemente decimos n: = n + 1. Pero esto es una tarea, no una ecuación

En Haskell, es válido escribir n = n + 1. Pero Haskell lo intentará y fallará. Dado que tratará de resolver n con n de forma recursiva. 

Pero como se puede vivir sin asignaciones? Pensemos en una declaración de asignación como si hiciera tres cosas:

  • Evalúa el lado derecho: calcula un valor útil.
  • Descarta el valor de la variable del lado izquierdo: destruye un valor que podría ser útil o no.
  • Guarda el valor útil del RHS en la variable.

En un lenguaje puramente funcional, nunca destruimos los viejos valores. Simplemente calculamos nuevos útiles. Si el valor anterior era realmente inútil, el recolector de basura reclamará su almacenamiento.