在HLint的上下文中,eta减少了什么意思

时间:2011-04-26 17:06:46

标签: haskell lambda-calculus 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 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:13)

嗯, eta reduction 是(单向)制作无点函数,通常意味着你可以删除函数的最后一个参数,如果它出现在一个函数的两端。表达

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将其转换为 one - 参数函数,该函数将"Haq!" ++应用于其参数。

答案 2 :(得分:10)

从lambda演算中,我们将eta转换定义为等式:

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

参见Barendregt,H。P. The Lambda Calculus:Its Syntax and Semantics ,1984。


在Haskell上下文中,请参阅the definition on the Haskell wiki

  

nta转换(也写成η-转换)是在函数上添加或删除抽象。例如,以下两个值在η-conversion下是等效的:

\x -> abs x

abs
  

从第一个到第二个的转换将构成一个eta减少,从第二个到第一个的转换将是一个eta抽象。术语“eta转换”可以指向任一方向的过程。   广泛使用η减少可以导致无点编程。它通常也用于某些编译时优化。