在HLint的上下文中,eta意味着什么?

| 我正在看教程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”的确切含义吗?     
已邀请:
只要
f
不会自由出现
x
,那么eta还原会将
\\x -> f x
变成
f
。 要检查它们是否相同,请将它们应用于某个值
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
的语法糖。相应地,也可以使用运算符的节符号ѭ12将其eta缩减为
(++) \"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! \"
因为ѭ15是运算符,所以还有其他可能性:
haqify = (\"Haq! \" ++ )
也就是说,parens将其转换为一个单参数函数,将ѭ20应用于其参数。     
根据lambda演算,我们将eta转换定义为等式:
 \\x -> M x == M      -- if x is not free in M.
参见Barendregt,H.P. Lambda微积分:其语法和语义,1984年。 在Haskell上下文中,请参阅Haskell Wiki上的定义,   n eta转换(也称为η转换)是在函数上添加或删除抽象。例如,以下两个值在η转换下是等效的:
\\x -> abs x
abs
  从第一个转换为第二个将构成eta减少,而从第二个转换为第一个将是eta抽象。术语“ eta转换”可以指任一方向的过程。   大量使用η减少可导致无点编程。它通常还用于某些编译时优化。     

要回复问题请先登录注册