F# 一个以上参数的功能

示例

在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
// 值五:整数= 5

但是,您还可以像add更“常规”的方式调用函数一样,直接向它传递两个参数,它将像您期望的那样工作:

let three = add 1 2
// 值三:整数= 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  // 这将计算0 + 0 + 1 + 2 + 3
// 值六:整数= 6

这种将多参数函数视为具有一个参数并返回新函数的函数的方法(可能依次具有一个参数并返回新函数,直到到达具有最终参数并最终返回结果的最终函数)为了纪念以开发该概念而闻名的数学家Haskell Curry,他将其称为currying。(它是别人发明的,但是咖喱理应得到大多数赞誉。)

F#中使用了这个概念,您需要熟悉一下。