Syntax 类型差异小

Syntax 类型差异小,syntax,f#,Syntax,F#,我有三个应该相等的功能: let add1 x = x + 1 let add2 = (+) 1 let add3 = (fun x -> x + 1) 为什么这些方法的类型不同? add1和add3是int->int,而add2是(int->int)。 它们都按预期工作,我只是好奇为什么FSI会以不同的方式呈现它们?这通常是一个不重要的区别,但如果您真的很好奇,请参阅F#spec的一节 我的简要总结是(int->int)是int->int的超集。由于add1和add3是语法函数,它们

我有三个应该相等的功能:

let add1 x = x + 1
let add2 = (+) 1
let add3 = (fun x -> x + 1) 
为什么这些方法的类型不同?
add1和add3是
int->int
,而add2是
(int->int)

它们都按预期工作,我只是好奇为什么FSI会以不同的方式呈现它们?

这通常是一个不重要的区别,但如果您真的很好奇,请参阅F#spec的一节


我的简要总结是
(int->int)
int->int
的超集。由于
add1
add3
是语法函数,它们被推断为具有更具体的类型
int->int
,而
add2
是一个函数值,因此被推断为具有类型
(int->int)
(并且不能被视为
int->int
).

您提到的规范部分与向其他语言呈现函数有关,说只有“true”函数才能实现int->int。我让C#项目引用F#项目,果然,add1和add3是可以从C#访问的方法,而add2则是作为FSharpFunc呈现的!我也很好奇,谢谢你的澄清。组合函数也是如此?(即设f=b>>m),其中f假定传递到b@Alex-将编译为方法的唯一内容是语法函数(要么
let f x=…
要么
let f=fun x->…
设f=b>>m
不是一个语法函数:
f
定义为通过将运算符
(>>)
应用于值
b
m
而获得的值。我希望这能回答你的问题。所以,最后,为了使组合函数对其他语言可用,你必须将它们封装在另一个函数中,在某种程度上否定F#的“高阶”参数,至少在互操作场景中是这样?我看不出有什么好的技术原因?@kvb-谢谢你的回答,非常感谢!