我正在使用这个在线编译器玩一些F#代码(我找不到确切的F#编译器版本,这将在以后相关).我意识到以下两个功能非常不同:
let f x y = x = y
let g x y = x != y
Run Code Online (Sandbox Code Playgroud)
f
是完全通用的,但令我惊讶的g
是没有.调用g 1 2
将导致消息的编译错误:
泛型构造要求类型'int'具有引用语义,但它不具有,即它是结构
我去了我自己的机器上尝试过这个(在单声道上使用F#3.0,但我在Visual Studio 2012中得到了相同的结果)并在我尝试定义时收到了完全不同的错误g
:
错误FS0332:无法解决在此程序点或附近使用运算符'(!=)'所固有的模糊性.考虑使用类型注释来解决歧义.
为什么这种使用!=
含糊不清,为什么会出错呢?另外,为什么这种使用被!=
认为是模棱两可的但是使用=
in f
不是?新错误有助于提醒我一个自动泛化无法按预期工作的情况.但是,这似乎是两个不同版本的F#编译器之间的重大变化.搜索这两个错误消息都显示为空.我没有在F#规范中看到任何看似相关的内容.任何指向相关部分的指针都会有所帮助.