簡體   English   中英

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

[英]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 -> fxf只要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM