F#入門-第三章 功能性-第一節 柯里化

    我們在介紹通過let語句來定義函數時,介紹過可以定義帶有幾個參數的函數。但是,有趣的是,這只是看上去如此而已,實際上F#的函數永遠只接受一個參數,帶有幾個參數的函數是將幾個接受單一參數的函數進行組合後的結果。爲什麼可以這樣,是因爲F#是可以將另外一個函數作爲函數的返回結果的。

    也就是說,可以將其考慮成將帶有兩個參數的函數用只帶有一個參數的函數進行表達。(將帶有參數A和B並返回C的函數表達成:將帶有參數B並返回C的這個函數FunctionA,作爲另一個新函數FunctionB的返回結果進行返回,新函數FunctionB接受參數A)。

    這個例子裏,針對前述FunctionA和FunctionB兩個函數來說,將參數A傳給另一個函數,該函數接受參數B,返回參數C,最後將接受A的函數返回,這一系列操作就叫做柯里化。

    一般情況下參數的個數很可能在兩個以上,根據百度百科的說法,變成如下方式-將帶有幾個參數的函數,轉變成:將第一個參數作爲最開始函數的參數,將該函數的執行結果返回,接受第二個參數,將該函數返回,接受第三個參數......,一直到接受最後一個參數,並返回該函數的執行結果。

    單靠語言表達可能比較難以理解,所以讓我們來看些實例。(確認的時候爲了立刻顯示函數信息,用解釋器的效果比較好)

柯里化
//定義執行加法運算的函數
> let add a b = a b;;
val add : int -> int -> int

//執行加法運算
> add 1 2;;
val it : int = 3

//柯里化。可以看出程序返回int -> int類型的函數。
> add 1;;
val it : (int -> int) = <fun:clo@5>

//當然,也可以應用在其他的函數定義上
> let inc1 = add 1;;
val inc1 : (int -> int)
> inc1 3;;
val it : int = 4

//也可以對複合運算符進行柯里化。與inc1作用相同的函數
> let inc1_2 = (( )1);;
val inc1_2 : (int -> int)
> inc1_2 3;;
val it : int = 4

//這回帶三個參數
> let add3 a b c = a b c;;
val add3 : int -> int -> int -> int

//柯里化。指定第一個參數
> add3 1;;
val it : (int -> int -> int) = <fun:clo@11>

//柯里化。指定第二個參數
> add3 1 2;;
val it : (int -> int) = <fun:clo@12>


    如上所述,三個以上的參數也可以進行柯里化。另外,就象上例中inc1函數那樣,可以使用柯里化簡單定義新的函數。如果理解了“以使用第一個參數爲起點“來進行柯里化,那麼也就可以很好地理解參數的執行順序和柯里化的過程了。

發佈了55 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章