在 F# 签名文件中,函数签名周围的括号有何意义?

cod*_*ast 5 f#

作为 .fsi 签名文件的使用者,两者之间有什么区别(如果有的话):

val sum : int -> int -> int
Run Code Online (Sandbox Code Playgroud)

val sum : (int -> int -> int)
Run Code Online (Sandbox Code Playgroud)

似乎第二个可以通过函数定义函数“别名”来实现,但第一个只能通过函数定义来实现。

具有以下内容:

// .fsi
val add : int -> int -> int
val sum : int -> int -> int
Run Code Online (Sandbox Code Playgroud)
// .fs
let add a b = a + b
let sum = add
Run Code Online (Sandbox Code Playgroud)

产生错误

error FS0034: Module 'Butter' contains
    val sum : (int -> int -> int)
but its signature specifies
    val sum : int -> int -> int    
Run Code Online (Sandbox Code Playgroud)

但是,如果签名文件是:

// .fsi
val add : (int -> int -> int)
val sum : (int -> int -> int)
Run Code Online (Sandbox Code Playgroud)

它编译正常。

这种行为是故意的吗,如果是的话,括号是如何改变界面的?

cod*_*ast 0

是的,这是故意行为。

\n

在创建一个更简单的示例来响应汤姆的回答时,我实际上正确地阅读了错误消息,它说:

\n
\n

签名和实现中的参数不同。签名\n指定“sum”是函数定义或\n接受至少 2 个参数的 lambda 表达式,但实现是一个计算\n函数值。要声明计算函数值是允许的\n实现,只需在签名中将其类型括起来,例如\xe2\x86\x94 val\nsum: int -> (int -> int)\xe2\x86\x94 而不是 \xe2\ x86\x94 值总和:int -> int -> int。

\n
\n

因此,括号用于指示计算表达式以及 lambda 和函数定义是允许的实现。(我不会假装我正确理解了其中的区别。)

\n