为什么这个(〜=)被认为是前缀运算符?

时间:2014-05-11 14:56:59

标签: f# operator-overloading

let tolerance = 0.00000001
let (~=) x1 x2 = abs(x1 - x2) < tolerance

这会引发错误: “无效的运算符定义。前缀运算符定义必须使用有效的前缀运算符名称”

这甚至不是前缀运算符,我不明白它为什么这么认为。

但是以下情况很好:

let (=~) x1 x2 = abs(x1 - x2) < tolerance

我只是改变了顺序,所以“=”出现在“〜”之前。

网上是否有任何文件说明了这方面的规定?

我正在使用带有“F#2013”​​的Visual Studio 2013。交互式控制台显示“F#Interactive version 12.0.21005.1”

2 个答案:

答案 0 :(得分:3)

您无法在F#中以~开头定义中缀运算符。

F# 3.0 specification, section Categorization of Symbolic Operators非常清楚地解释了原因:

  

运营商+-+.-.%%%&,{{1可以用作前缀和中缀运算符。当这些运算符用作前缀运算符时,波形符号字符会在内部添加以生成运算符名称,以便解析器可以将此类用法与运算符的中缀使用区分开来。例如,&&被解析为运算符-x的应用程序到标识符~-。此生成的名称也用于这些前缀运算符的定义。因此,以下前缀运算符的定义包括x字符。

答案 1 :(得分:2)

在F#中,第一个位置的~字符表示前缀运算符。例如,(~-)是前缀“对立”运算符:(~-) 3相当于- 3