Generics 为什么要使用'=';被认为模棱两可,但类似于'=';不是吗?

Generics 为什么要使用'=';被认为模棱两可,但类似于'=';不是吗?,generics,f#,Generics,F#,我在玩一些使用在线编译器的F#代码(我找不到确切的F#编译器版本,稍后会有相关内容)。我意识到以下两个功能非常不同: let f x y = x = y let g x y = x != y f是完全通用的,但令我惊讶的是g不是。调用g12将导致编译错误,并显示以下消息: 泛型构造要求类型“int”具有引用语义,但它不具有引用语义,即它是一个结构 我在自己的机器上尝试了这一点(在mono上使用F#3.0,但在Visual Studio 2012中得到了相同的结果),在尝试定义g时收到了一个完全

我在玩一些使用在线编译器的F#代码(我找不到确切的F#编译器版本,稍后会有相关内容)。我意识到以下两个功能非常不同:

let f x y = x = y
let g x y = x != y
f
是完全通用的,但令我惊讶的是
g
不是。调用
g12
将导致编译错误,并显示以下消息:

泛型构造要求类型“int”具有引用语义,但它不具有引用语义,即它是一个结构

我在自己的机器上尝试了这一点(在mono上使用F#3.0,但在Visual Studio 2012中得到了相同的结果),在尝试定义
g
时收到了一个完全不同的错误:

错误FS0332:无法解决在此程序点或其附近使用运算符“(!=)”时固有的歧义。考虑使用类型注释来解决歧义。< /P>
为什么要使用
=不明确,为什么是错误?还有,为什么要使用
=被认为不明确,但在
f
中使用
=
不明确?新的错误有助于提醒我自动泛化没有像我预期的那样起作用。然而,这似乎是两个不同版本的F#编译器之间的一个突破性变化。对这两条错误消息的搜索结果均为空。我在报告中没有看到任何相关内容。任何指向相关章节的指针都会有所帮助。

请注意
=
不是F#中不等式运算符的名称,


使用
应该是可能的,就像您的示例中的
=
一样。

现有的答案解释了为什么代码的行为不符合预期,所以让我添加一个错误消息的解释

F#支持自定义运算符,对于您尝试在函数中使用的任何其他(有效)运算符符号,您将收到相同的错误消息,例如fish运算符:

let fish x y = x <*>><< y
let inline add x y = x + y
add 1 2
add 1.1 2.2

类似地,您可以定义一个需要任何自定义运算符(如fish或
!=
)的内联函数,但您仍然无法使用任何标准类型调用它。

链接:现在我想知道为什么
=甚至是允许的(可能是因为它可能是一个自定义操作符?)。有C#背景,
=是很自然的,在线编译器让我不用花那么长时间使用它。@mikez编译器在推断意图方面只能做这么多。”。并非所有编写F#的人都来自algol背景。@OnorioCatenacci我的大部分困惑来自于这样一个事实,即我编写的代码片段与我预期的
一样有效=。我给他们写了一个升级/修复编译器的建议。我很想看到这些代码片段(认真的)。如果你能发布一些GIST,那就太好了。@mikez,虽然它在Rexest工作,但这是一个警告。我已经检查并调用fsc.exe生成“Microsoft(R)F#编译器版本11.0.50727.1”+1非常详细,谢谢。这是否适用于以下情况:PI恐怕自定义运算符中允许的字符集是,尤其是不包括任何非ASCII字符。@RubenBartelink您能做的最好的事情可能是
-^-^-^-^-^-^-^>>我的大部分困惑源于在线编译器接受
这一事实=并实现了我对引用类型的预期。我记录了他们更新/修复F#编译器的建议。感谢您对错误消息的解释。@TomasPetricek是的,但它是
CLSCompliant
P