Что означает сокращение 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. Он также обычно используется при определенных оптимизациях во время компиляции.