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