Что означает эта редукция в контексте 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 Reduce" в данном контексте?


person chollida    schedule 26.04.2011    source источник
comment
Редукция эта – это термин из лямбда-исчисления.   -  person hugomg    schedule 26.04.2011
comment
Опечатка, я думаю: haqify = ("Haq! " ++ )   -  person Andrew Jaffe    schedule 26.04.2011


Ответы (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. Это, в свою очередь, может быть сокращено до (++) "Haq! " или, что то же самое, с использованием нотации секций для операторов, ("Haq! " ++).

person yatima2975    schedule 26.04.2011

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

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

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

f = g 3

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

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

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

haqify = ("Haq! " ++ )

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

person Andrew Jaffe    schedule 26.04.2011

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

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

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


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

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

\x -> abs x

и

abs

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

person Don Stewart    schedule 26.04.2011
comment
Есть ли хорошая ссылка на то, когда эта-редукция может привести к лучшей оптимизации, а когда нет? - person John L; 27.04.2011
comment
GHC делает это за вас, так что нет. Это просто вопрос стиля. - person Don Stewart; 27.04.2011