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

时间:2015-08-20 11:02:07

标签: f#

为什么

let ab a b = a 5 + b

将产生

val ab : a:(int -> int) -> b:int -> int

let ab2 a b = a 5 +b

将产生

val ab2 : a:(int -> int -> 'a) -> b:int -> 'a

为什么这个空间在' +'之间?和' b'这有什么不同?

1 个答案:

答案 0 :(得分:10)

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

+既是二元加法运算符又是一元“正” 1 运算符。因此5 + b是对两个论点的补充的应用;但+b是应用于某些符号b的正算子。

因此

let ab a b = a 5 + b

被解析为:

let ab a b = (a 5) + b

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

let ab2 a b = a 5 +b

被解析为:

let ab2 a b = a (5) (+b)

a是两个参数的函数,无法推断它返回的类型。

1 我手边没有F#操作员列表,因此无法检查正确的名称。编辑:似乎我记错了: Arithmetic Operators (F#) : - )。