多個引數的功能

在 F#中,所有函式只接受一個引數。這似乎是一個奇怪的陳述,因為在函式宣告中宣告多個引數非常容易:

let add x y = x + y

但是如果你在 F#互動式直譯器中輸入那個函式宣告,你會看到它的型別簽名是:

val add : x:int -> y:int -> int

沒有引數名稱,該簽名是 int -> int -> int-> 運算子是右關聯的,這意味著此簽名等同於 int -> (int -> int)。換句話說,add 是一個函式,它接受一個 int 引數,並返回一個函式,它接受一個 int 並返回 int 。試試吧:

let addTwo = add 2
// val addTwo : (int -> int)
let five = addTwo 3
// val five : int = 5

但是,你也可以用更傳統的方式呼叫像 add 這樣的函式,直接傳遞兩個引數,它會像你期望的那樣工作:

let three = add 1 2
// val three : int = 3

這適用於具有任意數量引數的函式:

let addFiveNumbers a b c d e = a + b + c + d + e
// val addFiveNumbers : a:int -> b:int -> c:int -> d:int -> e:int -> int
let addFourNumbers = addFiveNumbers 0
// val addFourNumbers : (int -> int -> int -> int -> int)
let addThreeNumbers = addFourNumbers 0
// val addThreeNumbers : (int -> int -> int -> int)
let addTwoNumbers = addThreeNumbers 0
// val addTwoNumbers : (int -> int -> int)
let six = addThreeNumbers 1 2 3  // This will calculate 0 + 0 + 1 + 2 + 3
// val six : int = 6

這種將多引數函式視為帶有一個引數並返回新函式的函式的方法(可以依次接受一個引數並返回新函式,直到到達最終函式並獲取最終引數並最終返​​回結果)被稱為鑽營,在數學家哈斯克爾庫裡,誰是著名的開發理念的榮譽。 (它是由其他人發明的,但庫裡當之無愧地得到了它的大部分功勞。)

這個概念在整個 F#中使用,你會想要熟悉它。