Что означает сокращение eta в контексте 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" в этом контексте?

3 ответа

Решение

Это сокращение крутится \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! " ++),

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

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!" ++ к его аргументу.

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

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

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


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

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

\x -> abs x

а также

abs

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

Другие вопросы по тегам