为什么
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'这有什么不同?
答案 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#) : - )。