多个参数的功能
在 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#中使用,你会想要熟悉它。