多個引數的功能
在 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#中使用,你會想要熟悉它。