cho*_*ida 11 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
Run Code Online (Sandbox Code Playgroud)
在HLint下运行此程序时,它会出现以下错误;
./Haq.hs:11:1: Warning: Eta reduce
Found:
haqify s = "Haq! " ++ s
Why not:
haqify = ("Haq! " ++ )
Run Code Online (Sandbox Code Playgroud)
有人能否对"Eta Reduce"在这种背景下意味着什么有所了解?
yat*_*975 19
埃塔减少转向 \x -> f x到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
Run Code Online (Sandbox Code Playgroud)
你的定义haqify被视为\s -> "Haq! " ++ s,这是语法糖\s -> (++) "Haq! " s.反过来,这可以减少到(++) "Haq! "或等效地使用运算符的节符号("Haq! " ++).
And*_*ffe 14
那么,ETA减少是(单程),使自由点的功能,并且通常意味着如果它出现在表达式的两侧的端,你可以删除功能的最后一个参数.
f :: Int -> Int
g :: Int -> Int -> Int
f s = g 3 s
Run Code Online (Sandbox Code Playgroud)
可以转换为
f = g 3
Run Code Online (Sandbox Code Playgroud)
然而,在这种情况下,它稍微复杂一些,因为(++)在rhs上存在双参数运算符的语法糖,这是类型[a] -> [a] -> [a].但是,您可以将其转换为更标准的功能:
haqify :: [Char] -> [Char]
haqify = (++) "Haq! "
Run Code Online (Sandbox Code Playgroud)
因为(++)是运营商,还有其他可能性:
haqify = ("Haq! " ++ )
Run Code Online (Sandbox Code Playgroud)
也就是说,parens将其转换为适用于其参数的单参数函数"Haq!" ++.
Don*_*art 12
从lambda演算中,我们将eta转换定义为相等:
\x -> M x == M -- if x is not free in M.
Run Code Online (Sandbox Code Playgroud)
参见Barendregt,HP The Lambda Calculus:Syntax and Semantics,1984.
在Haskell上下文中,请参阅Haskell wiki上的定义,
nta转换(也写成η-转换)是在函数上添加或删除抽象.例如,以下两个值在η-conversion下是等效的:
\x -> abs x
Run Code Online (Sandbox Code Playgroud)
和
abs
Run Code Online (Sandbox Code Playgroud)
从第一个到第二个的转换将构成一个eta减少,从第二个到第一个的转换将是一个eta抽象.术语"eta转换"可以指向任一方向的过程.广泛使用η减少可以导致无点编程.它通常也用于某些编译时优化.
| 归档时间: |
|
| 查看次数: |
3955 次 |
| 最近记录: |