F# 当只有一个输入参数时,F是否会以不同的方式处理参数匹配?

F# 当只有一个输入参数时,F是否会以不同的方式处理参数匹配?,f#,parameters,F#,Parameters,函数匹配基于F中文件的定义: let f2 x y = x + y let value5 = f2 10 20 let value = f2(10, 20) <-- Error let f3 (x, y) = x + y let value6 = f3(10, 20) let value = f3 10 20 <-- Error 为什么会这样?当只有一个输入参数时,F是否会以不同的方式处理参数匹配 我怀疑这与元组和咖喱有关。基本上,一个项的元组再次成为单数项,但在其他两种情况下,

函数匹配基于F中文件的定义:

let f2 x y = x + y
let value5 = f2 10 20
let value = f2(10, 20) <-- Error

let f3 (x, y) = x + y
let value6 = f3(10, 20)
let value = f3 10 20 <-- Error

为什么会这样?当只有一个输入参数时,F是否会以不同的方式处理参数匹配

我怀疑这与元组和咖喱有关。基本上,一个项的元组再次成为单数项,但在其他两种情况下,我们有以下情况:

第一种情况f2实际上是一个函数,它接受一个值x并返回一个接受另一个函数的值。在这里,我们可以看到从f2到add10的咖喱用法

我们在元组中得到一个错误,因为我们没有以接收元组的方式定义它。在第二个例子中,我们遇到了一个类似的问题,我们定义了一个函数来获取两个值的元组,它知道如何处理这些值,但是我们现在传递给它两个值,而不是它期望的元组值,因此我们收到了一个错误

再一次,在最后一个例子中,我们有一个单一项的元组,因此fx和fx实际上是相同的


我的推理可能是错误的,但我相信这就是为什么会出现错误。

正如ashays正确解释的那样,声明函数的两种方式是不同的。您可以通过查看类型签名看到这一点。这是一个F交互式会话:

> let f1 (x, y) = x + y;;  
val f1 : int * int -> int

> let f2 x y = x + y;;
val f2 : int -> int -> int
第一个函数接受int*int类型的元组并返回int。调用它时,需要指定仅为单个值的元组:

// Using tuple directly as the argument
f1 (1, 2)

// .. or by declaring tuple value first
let tup = (1, 2)
f1 tup
第二个函数的类型是int->int->int,这与int->int->int相同。这意味着它是一个接受int并返回一个接受int并返回int的函数的函数。此表单称为curried表单,它允许您使用ashays演示的部分函数应用程序。事实上,呼吁:

f2 1 2

// Could be written as:
(f2 1) 2

此外,F中的元组文字是由逗号而不是括号创建的。换句话说,设foo=x,y与设foo=x,y相同,f 10与f10相同-创建一个元素组不会改变调用方法的方式。
// Using tuple directly as the argument
f1 (1, 2)

// .. or by declaring tuple value first
let tup = (1, 2)
f1 tup
f2 1 2

// Could be written as:
(f2 1) 2