为什么这些作业产生不同的结果?

Twe*_*lve 6 f#

为什么

let ab a b = a 5 + b
Run Code Online (Sandbox Code Playgroud)

会产生

val ab : a:(int -> int) -> b:int -> int
Run Code Online (Sandbox Code Playgroud)

let ab2 a b = a 5 +b
Run Code Online (Sandbox Code Playgroud)

会产生

val ab2 : a:(int -> int -> 'a) -> b:int -> 'a
Run Code Online (Sandbox Code Playgroud)

为什么'+'和'b'之间的这个空格会产生这种差异?

Ric*_*ard 10

这完全取决于解析器如何优先考虑不同的语法选项以避免歧义.

+是二元加法运算符和一元"正" 1运算符.5 + b因此,对两个论点的加法应用; 但是+b正面的算子应用于某些符号b.

从而

let ab a b = a 5 + b
Run Code Online (Sandbox Code Playgroud)

被解析为:

let ab a b = (a 5) + b
Run Code Online (Sandbox Code Playgroud)

a一个整数参数的函数返回一个int,因此可以添加到b; 但

let ab2 a b = a 5 +b
Run Code Online (Sandbox Code Playgroud)

被解析为:

let ab2 a b = a (5) (+b)
Run Code Online (Sandbox Code Playgroud)

a作为的两个参数的函数,没有办法来推断它返回的类型.

1我手边没有F#操作员列表,因此无法检查正确的名称.编辑:看起来我记错了:算术运算符(F#) :-).