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