我正在使用 this 玩一些 F# 代码在线编译器(我找不到确切的 F# 编译器版本,稍后会用到)。我意识到以下两个功能非常不同:
let f x y = x = y
let g x y = x != y
f
完全通用,但令我惊讶的是 g
不是。调用 g 1 2
将导致编译错误消息:A generic construct requires that the type 'int' have reference semantics, but it does not, i.e. it is a struct
我在自己的机器上尝试了这个(在单声道上使用 F# 3.0,但我在 Visual Studio 2012 中得到了相同的结果)并在我尝试定义
g
时收到了完全不同的错误。 :error FS0332: Could not resolve the ambiguity inherent in the use of the operator '( != )' at or near this program point. Consider using type annotations to resolve the ambiguity.
为什么使用
!=
模棱两可,为什么是错误?另外,为什么要使用 !=
被认为是模棱两可的,但使用了 =
在 f
不是?新错误有助于提醒我注意自动泛化没有按预期工作的情况。但是,这似乎是 F# 编译器的两个不同版本之间的重大变化。对这两个错误消息的搜索结果都为空。我在 F# specification 中没有看到任何内容这似乎很重要。任何指向相关部分的指针都会有所帮助。
最佳答案
请注意 !=
不是 F# 中不等式运算符的名称,<>
是。
http://msdn.microsoft.com/en-us/library/dd233228.aspx
使用 <>
应该可以和 =
一样在你的例子中。
关于generics - 为什么 '!=' 的使用被认为是模棱两可的,而 '=' 的类似用法却不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19488189/