括号更改功能签名

时间:2017-02-24 00:40:53

标签: f#

当我在函数定义中设置括号时,函数类型会发生变化。

我有两个函数:addition1(不带括号)和addition2(带括号)。类型相同,但功能签名不同。为什么类型不同?

let addition1 a b =
  a + b
//val addition1 : a:int -> b:int -> int

let addition2(a, b) = 
  a + b
//val addition2 : a:int * b:int -> int

1 个答案:

答案 0 :(得分:9)

  

类型相同,但功能签名不同。为什么类型不同?

这些类型实际上并不相同。

当你写:

let addition1 a b = a + b

您创建的功能明显不同于

let addition2 (a, b) = a + b

在第二种情况下,括号和逗号正在创建tuple,这意味着您的函数接受单个参数,该参数是一个元组(键入为int * int),并返回{{1 }}

第一种情况创造了一个可以咖喱的功能。 int的类型签名意味着它创建一个接受int的函数,然后返回一个接受和int并返回int 的函数。这允许您使用部分应用程序:

int -> int -> int

有关详细信息,请参阅官方文档中的functionsCurrying from fsharpforfunandprofit

在F#代码中允许currying更为常见。通常,使用元组作为参数主要是针对具有基类库的互操作场景或在规划从C#或其他语言使用的API时完成的。能够部分应用允许像管道这样的东西正常工作:

let partially_applied_addition1 = addition1 3

tupled表单不会使用上面的代码进行编译,因为它无法与部分应用程序一起使用。