我們在介紹通過let語句來定義函數時,介紹過可以定義帶有幾個參數的函數。但是,有趣的是,這只是看上去如此而已,實際上F#的函數永遠只接受一個參數,帶有幾個參數的函數是將幾個接受單一參數的函數進行組合後的結果。爲什麼可以這樣,是因爲F#是可以將另外一個函數作爲函數的返回結果的。
也就是說,可以將其考慮成將帶有兩個參數的函數用只帶有一個參數的函數進行表達。(將帶有參數A和B並返回C的函數表達成:將帶有參數B並返回C的這個函數FunctionA,作爲另一個新函數FunctionB的返回結果進行返回,新函數FunctionB接受參數A)。
這個例子裏,針對前述FunctionA和FunctionB兩個函數來說,將參數A傳給另一個函數,該函數接受參數B,返回參數C,最後將接受A的函數返回,這一系列操作就叫做柯里化。
一般情況下參數的個數很可能在兩個以上,根據百度百科的說法,變成如下方式-將帶有幾個參數的函數,轉變成:將第一個參數作爲最開始函數的參數,將該函數的執行結果返回,接受第二個參數,將該函數返回,接受第三個參數......,一直到接受最後一個參數,並返回該函數的執行結果。
單靠語言表達可能比較難以理解,所以讓我們來看些實例。(確認的時候爲了立刻顯示函數信息,用解釋器的效果比較好)
//定義執行加法運算的函數 |
如上所述,三個以上的參數也可以進行柯里化。另外,就象上例中inc1函數那樣,可以使用柯里化簡單定義新的函數。如果理解了“以使用第一個參數爲起點“來進行柯里化,那麼也就可以很好地理解參數的執行順序和柯里化的過程了。