Pregunta Qué significa eta reduce en el contexto de HLint


Estoy viendo el tutorial http://haskell.org/haskellwiki/How_to_write_a_Haskell_program

import System.Environment

main :: IO ()
main = getArgs >>= print . haqify . head

haqify s = "Haq! " ++ s

Cuando se ejecuta este programa bajo HLint, se produce el siguiente error;

./Haq.hs:11:1: Warning: Eta reduce
Found:
  haqify s = "Haq! " ++ s
Why not:
  haqify = ("Haq! " ++ )

¿Alguien puede arrojar algo de luz sobre qué exactamente "Eta Reduce" significa en este contexto?


9
2018-04-26 17:06


origen


Respuestas:


La reducción de Eta está cambiando \x -> f x dentro f Mientras f no tiene una ocurrencia libre de x.

Para comprobar que son iguales, aplicarlos a algún valor y:

(\x -> f x) y === f' y -- (where f' is obtained from f by substituting all x's by y)
              === f y  -- since f has no free occurrences of x

Tu definición de haqify es visto como \s -> "Haq! " ++ s, que es azúcar sintáctico para \s -> (++) "Haq! " s. Eso, a su vez puede ser reducido a eta para (++) "Haq! ", o de manera equivalente, usando la notación de sección para los operadores, ("Haq! " ++).


17
2018-04-26 17:23



Bien, reducción de eta es (una forma) para hacer funciones sin puntos, y generalmente significa que puede eliminar el último parámetro de una función si aparece al final en ambos lados de una expresión.

f :: Int -> Int
g :: Int -> Int -> Int
f s = g 3 s 

se puede convertir a

f = g 3

Sin embargo, en este caso es un poco más complicado, ya que existe el azúcar sintáctico del operador de dos parámetros (++) en el rhs, que es tipo [a] -> [a] -> [a]. Sin embargo, puede convertir esto a una función más estándar:

 haqify ::  [Char] -> [Char]
 haqify = (++) "Haq! "

Porque (++) es un operador, hay otras posibilidades:

haqify = ("Haq! " ++ )

Es decir, los parens convierten esto en un uno-función de parámetro que se aplica "Haq!" ++ a su argumento.


13
2018-04-26 17:26



A partir del cálculo lambda, definimos la conversión eta como la igualdad:

 \x -> M x == M      -- if x is not free in M.

Ver Barendregt, H. P. El cálculo Lambda: su sintaxis y semántica, 1984


En el contexto de Haskell, ver la definición en la Wiki Haskell,

n conversión eta (también escrita η-conversión) es agregar o eliminar abstracción sobre una función. Por ejemplo, los siguientes dos valores son equivalentes en η-conversion:

\x -> abs x

y

abs

La conversión de la primera a la segunda constituiría una reducción eta, y pasar de la segunda a la primera sería una abstracción eta. El término 'conversión eta' puede referirse al proceso en cualquier dirección.   El uso extensivo de η-reducción puede conducir a la programación Pointfree. También se usa típicamente en ciertas optimizaciones en tiempo de compilación.


10
2018-04-26 17:26