多个参数的功能

在 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#中使用,你会想要熟悉它。