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

时间:2011-06-05 22:30:13

标签: 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#的参数:

let f n = n + 10
let value3 = f 10
let value4 = f(10)

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

2 个答案:

答案 0 :(得分:4)

正如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

答案 1 :(得分:1)

我的怀疑是这与元组和curry有关。基本上,一个项目的元组再次成为单个项目,但在我们的其他两个案例中,我们有以下内容:

第一种情况(f2)实际上是一个函数,它接受一个值(x)并返回一个带另一个函数的值。在这里,我们可以看到从f2add10

使用currying
let add10 = f2 10     
let myVal = add10 20

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

再一次,在最后一种情况下,我们有一个单项的元组,因此f xf(x)实际上是相同的。

我的理由可能是错的,但我相信这就是你犯错误的原因。