簡體   English   中英

Haskell函數組成

[英]Haskell function composition

我正在閱讀關於Haskell的教程。 他們將功能組成定義如下:

(.)                     :: (b->c) -> (a->b) -> (a->c)
f . g                   = \ x -> f (g x)

我沒有提供任何例子,我相信這會讓我了解這里定義的內容。

有人能提供一個關於如何使用函數組合的簡單示例(有解釋)嗎?

函數組合是將兩個函數“組合”成一個函數的一種方法。 這是一個例子:

假設你有這些功能:

even :: Int -> Bool
not :: Bool -> Bool

並且你想使用上面的兩個來定義你自己的myOdd :: Int -> Bool函數。

顯而易見的方法如下:

myOdd :: Int -> Bool
myOdd x = not (even x)

但是這可以使用函數組合更簡潔地完成:

myOdd :: Int -> Bool
myOdd = not . even

myOdd函數的行為完全相同,但第二個函數是通過將兩個函數“粘合”在一起而創建的。

這個特別有用的場景是不需要顯式的lambda。 例如:

map (\x -> not (even x)) [1..9]

可以改寫為:

map (not . even) [1..9]

更短,更少的錯誤空間。

有趣的旁注。 函數組合相當於邏輯中的三段論:

所有人都是凡人。 蘇格拉底是個男人。 因此,蘇格拉底是凡人。

三段論將兩個物質含義組合成一個:

(Man => Mortal), (Socrates => Man), therefore (Socrates => Mortal)

因此...

(b -> c) -> (a -> b) -> (a -> c)

... ...的類型. 功能。

of f and g is a function that first applies g to its argument, then f to the value returned by g . 所述的 fg是第一應用一個函數g到它的參數,然后f到由返回的值g 然后它返回f的返回值。

這種身份可能具有啟發性:

f (g x) = (f . g) x

如果您有Java / C背景,請考慮以下示例:

int f(int x);
int g(int x);
int theComposition(int x) { return f(g(x)); }

這個例子是人為的,但假設我們有

sqr x = x * x  
inc x = x + 1

我們想寫一個計算x ^ 2 + 1的函數。 我們可以寫

xSquaredPlusOne = inc . sqr

(意思是

xSquaredPlusOne x = (inc . sqr) x

意思是

xSquaredPlusOne x = inc(sqr x)

因為f = inc和g = sqr)。

函數組合是將兩個或多個函數鏈接在一起的方法。 它經常被比作貝殼管道。 例如,在Unix風格的shell中,你可能會寫類似的東西

cat foo.txt | sort -n | less

這會運行cat ,將其輸出提供給sort ,並將其輸出提供給less

嚴格來說,這就像Haskell $運算符。 你可能會寫類似的東西

sum $ sort $ filter (> 0) $ my_list

請注意,與shell示例不同,它從右到左讀取。 所以我們從my_list開始作為輸入,然后我們對它進行filter ,然后我們對它進行sort ,然后我們計算它的sum

函數組合運算符, . ,做類似的事情。 上面的例子產生了一個數字 ; 下面的例子產生一個函數

sum . sort . filter (> 0)

請注意,我們實際上沒有將列表輸入到此中。 相反,我們剛剛創建了一個新函數,我們可以為該函數提供幾個不同的列表。 例如,您可以命名此函數:

my_function = sum . sort . filter (> 0)

或者您可以將其作為參數傳遞給另一個函數:

map (sum . sort . filter (> 0)) my_lists

您基本上可以在任何可以使用任何其他功能的地方使用它。 它只是一種快速且可讀的方式來表達“我想將這些功能鏈接在一起”。

HaskellWiki頁面上的函數組成:

desort = (reverse . sort)

現在, desort是一個反向排序列表的函數。 基本上, desort將它的參數提供給sort ,然后將sort的返回值反饋給reverse ,返回它。 所以它對它進行排序,然后它反轉排序列表。

暫無
暫無

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

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