Haskell Hero

Haskell Hero es un manual interactivo del lenguaje Haskell para principiantes.

Eta conversión

¿Qué es la eta conversión?

La eta conversión es un método de como quitar parámetros formales de definiciones de funciones.

  • La eta conversión es un método de como quitar parámetros formales de definiciones de funciones.
  • Si no, modificamos el lado derecho de tal manera para que el significado de la expresión quede el mismo.

Por ejemplo una función

mas x y  =  x + y

se puede expresar sin parámetros formales de manera siguiente:

  • Convertimos la expresión x + y en la notación prefija.
    mas x y  =  (+) x y
    
  • El parámetro y está totalmente a la derecha, entonces podemos quitarlo de la definición.
    mas x  =  (+) x
    
  • Ahora también el parámetro x está totalmente a la derecha, entonces lo podemos quitar también.
    mas  =  (+)
    

    Hemos expresado la función mas sin parámetros formales.

Ejemplo

Definid esta función sin el uso de lambdas:

\x -> 0 < 35 - 3 * 2 ^ x


Primero convertimos toda la expresión en la notación prefija respectando las prioridades de operadores individuales.

\x -> (<) 0 ((-) 35 ((*) 3 ((^) 2 x)))

La notación prefija de funciones binarias la podemos escribir como una aplicación parcial de una función binaria a un parámetro.
\x -> (0<) ((35-) ((3*) ((2^) x)))

Ahora ya podemos empezar con la conversión de la expresión al estilo pointfree (libre de puntos). Vamos a usar la definición de la función (.):
(f . g) x = f (g x)

Esta definición la aplicamos al parámetro de la función (35-):
(3*) ((2^) x)
--f- (--g- x)

\x -> (0<) ((35-) (((3*).(2^)) x))

Seguimos de la misma manera:
(35-) (((3*).(2^)) x)
--f-- (-----g----- x)

\x -> (0<) (((35-).((3*).(2^))) x)

Otra vez lo mismo.
(0<) (((35-).((3*).(2^))) x)
--f- (---------g--------- x)

\x -> ((0<).((35-).((3*).(2^)))) x

Ahora el parámetro x está ya totalmente a la derecha, entonces podemos quitar la lambda.
(0<).((35-).((3*).(2^)))

Ya que la función (.) asocia de la derecha, podemos quitar las paréntesis que indican el orden de la evaluación.
(0<).(35-).(3*).(2^)