簡體   English   中英

減少數據修改的Eta

[英]Eta reduction for data modification

我收到一個警告,要求減少以下lambda表達式。

\(DataType arg1 arg2) -> DataType (modify arg1) arg2

互聯網告訴我eta-reducing意味着省去不必要的lambda。

map (\x -> fun x) list
map fun list

這怎么適用於上面的代碼? 我可能只是缺少修改數據類型的基本語法?

對於這種情況,你不能再進一步減少它。 lambda只有一個參數,即(DataType arg1 arg2) 這些不是單獨的參數,如括號所示,而是在構造函數上進行模式匹配。 實際上,編譯器會將此表達式減少為更類似的表達式

\arg -> case arg of
    DataType arg1 arg2 -> DataType (modify arg1) arg2

這里更清楚的是,lambda只有一個參數,並且它沒有以可以減少它的方式使用。 減少的主要規則是你有類似的東西

\a b c -> f b a c

c參數顯示為參數聲明和表達式中的最后一個術語,因此可以刪除它:

\a b -> f b a

現在,如果我們想減少這個lambda,我們可以定義一個更高階的函數

flip f a b = f b a

並簡單地寫出來

flip f

(需要注意的是flip已經存在Prelude )。

您可以應用的另一個規則是處理$運算符時。 簡而言之,如果你有類似的東西

\a b c -> f a $ g b $ h c

然后你可以先把它變成一個組合:

\a b c -> (f a . g b . h) c

現在刪除c參數很簡單

\a b -> f a . g b . h

一般來說,你通常可以交換$ s . s並刪除最后一個參數。

同樣,這不適用於您的情況,因為您的函數只有1個參數,並且該參數是模式匹配的,以提取構造函數的參數,然后從中重構一個全新的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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