gpt4 book ai didi

f# - 括号改变函数签名

转载 作者:行者123 更新时间:2023-12-04 17:31:41 26 4
gpt4 key购买 nike

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

我有两个功能: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

最佳答案

The types are the same, but the function signature is different. Why the type different?



类型实际上并不相同。

当你写:
let addition1 a b = a + b

您创建了一个与
let addition2 (a, b) = a + b

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

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

详情见 functions在官方文档中,和 Currying from fsharpforfunandprofit .

允许柯里化(Currying)在 F# 代码中更为常见。通常,使用元组作为参数主要用于与基类库的互操作场景,或者在规划要从 C# 或其他语言使用的 API 时。能够部分应用允许管道等工作正常工作:
let answer =
getSomeIntegerValue ()
|> addition1 12 // Add 12 to result

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

关于f# - 括号改变函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42428829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com