Что означает eta reduce в контексте HLint

Я смотрю на учебник http://haskell.org/haskellwiki/How_to_write_a_Haskell_program

import System.Environment

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

haqify s = "Haq! " ++ s

при запуске этой программы под HLint она дает следующую ошибку;

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

может кто-нибудь пролить свет на то, что именно "Eta Уменьшить" означает в данном контексте?

3 ответов


Eta сокращение поворачивается \x -> f x на f пока f не имеет свободного вхождения x.

чтобы проверить, что они одинаковы, примените их к некоторому значению 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

определение haqify считается \s -> "Haq! " ++ s, который является синтаксическим сахаром для \s -> (++) "Haq! " s. Это, в свою очередь, может быть eta-сведено к (++) "Haq! ", или эквивалентно, используя обозначения разделов для операторов,("Haq! " ++).


Ну eta сокращение (один из способов) сделать функции без точек и обычно означает, что вы можете удалить последний параметр функции, если он появляется в конце с обеих сторон выражения.

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

можно преобразовать в

f = g 3

однако в этом случае это несколько сложнее, так как существует синтаксический сахар двухпараметрического оператора (++) на rhs, который является типом [a] -> [a] -> [a]. Тем не менее, вы можете преобразовать это в более стандартная функция:

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

, потому что (++) является оператором, есть и другие возможности:

haqify = ("Haq! " ++ )

то есть, parens преобразуют это в один - функция параметра, которая применяется "Haq!" ++ его аргумент.


из лямбда-исчисления мы определяем преобразование eta как равенство:

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

См. Barendregt, H. P. лямбда-исчисление: его синтаксис и семантика, 1984.


в контексте Haskell см. определение на Haskell wiki,

преобразование N eta (также написанное η-преобразование) добавляет или отбрасывает абстракцию над функцией. Например, следующие два значения эквивалентны η-преобразование:

\x -> abs x

и

abs

преобразование из первого во второй будет представлять собой сокращение эта, а переход от второго к первому будет абстракцией эта. Термин "преобразование эта" может относиться к процессу в любом направлении. Широкое использование η-редукции может привести к программированию без точек. Он также обычно используется в некоторых оптимизациях времени компиляции.