Что означает сокращение eta в контексте HLint - PullRequest
9 голосов
/ 26 апреля 2011

Я смотрю на учебник 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" означает в этом контексте?

Ответы [ 3 ]

17 голосов
/ 26 апреля 2011

Уменьшение 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! " ++).

13 голосов
/ 26 апреля 2011

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

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! " ++ )

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

10 голосов
/ 26 апреля 2011

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

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

См. Барендрег, Х. П. Лямбда-исчисление: его синтаксис и семантика , 1984.


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

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

\x -> abs x

и

abs

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

...