【问题标题】:Parenthesis change the function signature括号改变函数签名
【发布时间】:2017-02-24 00:40:53
【问题描述】:

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

我有两个函数: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

【问题讨论】:

  • 您还添加了一个逗号,这是一个很大的变化
  • 不一样,第一个函数取两个参数(实际上取第一个参数然后创建一个取第二个参数的函数)。并且可以咖喱。第二个函数采用一个参数,即一个元组。第一种形式在 F# 代码中很常见,第二种更适用于与 BCL 的互操作。
  • @s952163 我明白了。有什么明显的区别吗?

标签: f#


【解决方案1】:

类型相同,但函数签名不同。为什么类型不同?

类型实际上并不相同。

当你写作时:

let addition1 a b = a + b

你创建了一个明显不同的函数

let addition2 (a, b) = a + b

在第二种情况下,括号和逗号创建了一个tuple,这意味着您的函数接受一个参数,它是一个元组(类型为int * int),并返回一个int

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

let partially_applied_addition1 = addition1 3

详情见官方文档functionsCurrying from fsharpforfunandprofit

允许柯里化在 F# 代码中更为常见。通常,使用元组作为参数主要用于与基类库的互操作场景,或者在规划要从 C# 或其他语言使用的 API 时。能够部分应用可以让管道之类的东西正常工作:

let answer =
    getSomeIntegerValue ()
    |> addition1 12 // Add 12 to result

元组形式无法与上述一起编译,因为它不能与部分应用程序一起使用。

【讨论】:

    猜你喜欢
    • 2019-02-05
    • 1970-01-01
    • 2011-10-07
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2016-01-01
    相关资源
    最近更新 更多