[英]What does eta reduce mean in the context of 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”在这种背景下究竟意味着什么?
埃塔减少转弯\\x -> fx
成f
只要f
不具有的自由occurence 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
然而,在这种情况下,它稍微复杂一些,因为在rhs上存在双参数运算符(++)
的语法糖,类型为[a] -> [a] -> [a]
。 但是,您可以将其转换为更标准的功能:
haqify :: [Char] -> [Char]
haqify = (++) "Haq! "
因为(++)
是一个运算符,还有其他可能性:
haqify = ("Haq! " ++ )
也就是说,parens将其转换为一个参数"Haq!" ++
的单参数函数"Haq!" ++
"Haq!" ++
来论证。
从lambda演算中,我们将eta转换定义为相等:
\x -> M x == M -- if x is not free in M.
参见Barendregt,HP The Lambda Calculus:Syntax and Semantics ,1984。
在Haskell上下文中,请参阅Haskell wiki上的定义 ,
nta转换(也写成η-转换)是在函数上添加或删除抽象。 例如,以下两个值在η-conversion下是等效的:
\x -> abs x
和
abs
从第一个到第二个的转换将构成一个eta减少,从第二个到第一个的转换将是一个eta抽象。 术语“eta转换”可以指向任一方向的过程。 广泛使用η减少可以导致无点编程。 它通常也用于某些编译时优化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.