generics - 为什么 '!=' 的使用被认为是模棱两可的,而 '=' 的类似用法却不是?

标签 generics f#

我正在使用 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/

相关文章:

list - 为什么 List.length 的复杂度是线性的?

java - 通用方法协方差 - 有效限制或编译器监督?

Typescript - 当传入多个键值时缩小函数中的 T[K]

Java 集合 : Pass collection of children as collection of parents

java - Java 中任何对象的编译时类型与运行时类型之间有什么区别?

f# - 如何通过 .fsproj 文件构建 F# 项目?

F# 多条件 if/else 与匹配

java - 支持/整合语言测量单位的策略是什么?

multithreading - 等待而不阻塞线程? - 如何?

java方法返回类型