函數式編程之-組合函數


組合

函數式編程的核心在於組合,其中之一就是如何組合函數。我們在Currying一文就提到過組合,我們當時是這樣描述的:只有一個輸入和一個輸出的函數才能完成組合,當然並不是所有的函數都只有一個輸入,Currying可以幫助我們把多個輸入參數的函數變成只有一個輸入的函數。
那么到底什么是組合,怎么組合?
給定下面的兩個函數:

組合上面的兩個函數:

變成下面的函數:

看個例子:

let add1 x = x + 1 
let multiply2 x = x * 2
let compose g f x = f(g(x))

對應的函數類型為:

add1 : x:int -> int
multiply2 : x:int -> int
compose : g:('a -> 'b) -> f:('b -> 'c) -> x:'a -> 'c

通過compose函數來把add1和multiptly2組合起來:

let add1ThenMultiply2 x = compose add1 multiply2
從而得到新的函數: ```fsharp let result = add1ThenMultiply2 10 ``` 既然compose這個函數在F#這么常用,不如定義一個操作符`>>`來表示: ``` fsharp let (>>) f g x = g ( f(x) ) ``` 因此上面的代碼也可以通過>>來組合: ```fsharp let add1ThenMultiply2 x = (>>) add1 multiply2 ``` 由於操作符支持中綴表達式,也即操作符可以寫在兩個參數的中間,例如+號: ```fsharp (+) 1 3 ``` 實際上可以寫為: ```fsharp 1 + 3 ``` 那么上面的代碼就可以寫成: ```fsharp let add1ThenMultiply2 x = add1 >> multiply2 ``` ## 組合和管道符的區別 上面的例子我們還可以用管道符來實現: ``` fsharp let result1 = 10 |> add1 |> multiply2 ``` 管道符和組合的定義看起來非常相似: ```fsharp let (|>) x f = f x let (>>) f g x = g ( f(x) ) ``` 管道符(|>)接受兩個參數,在往下一個管道符傳遞的時候已經完成了求值,而函數組合實際上生成了新的函數,最后一步傳入實際的參數才會完成求值。 下面的圖示描述了管道符的求值過程:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM