【问题标题】:Why is this (~=) considered a prefix operator?为什么这个 (~=) 被认为是前缀运算符?
【发布时间】:2014-05-11 14:56:58
【问题描述】:
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 版本 12.0.21005.1”

【问题讨论】:

    标签: f# operator-overloading


    【解决方案1】:

    您不能在 F# 中定义以 ~ 开头的中缀运算符。

    F# 3.0 specification, section Categorization of Symbolic Operators 解释得很清楚:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 所以你不能定义一个以“~”开头的中缀运算符?
      • 那么就没有什么可以逃脱波浪线了吗?
      猜你喜欢
      • 2010-11-26
      • 2011-08-30
      • 1970-01-01
      • 2022-11-24
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 2011-10-26
      相关资源
      最近更新 更多