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