当我在函数定义中设置括号时,函数类型会发生变化。
我有两个函数: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
答案 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
有关详细信息,请参阅官方文档中的functions和Currying from fsharpforfunandprofit。
在F#代码中允许currying更为常见。通常,使用元组作为参数主要是针对具有基类库的互操作场景或在规划从C#或其他语言使用的API时完成的。能够部分应用允许像管道这样的东西正常工作:
let partially_applied_addition1 = addition1 3
tupled表单不会使用上面的代码进行编译,因为它无法与部分应用程序一起使用。