【问题标题】:Why is $ allowed but $$, or <$> disallowed as an operator (FS0035) and what makes $ special?为什么允许使用 $ 但不允许使用 $$ 或 <$> 作为运算符 (FS0035)?是什么让 $ 如此特别?
【发布时间】:2017-05-09 11:30:40
【问题描述】:

$ 允许在自定义运算符中使用,但如果您尝试使用 $$&lt;$&gt; 或例如 ~$% 作为运算符名称,您将收到以下错误:

错误 FS0035:不推荐使用此构造:'$' 不允许作为运算符名称中的字符,保留以供将来使用

$ 显然名称中也有'$',但是可以,为什么? 即:

let inline ( $ ) f y = f y

// using it works just fine:
let test = 
    let add x = x + 1
    add $ 12

我在在线示例中经常看到$,并且显然是一种特殊的运算符。 $(即在 Haskell 或 OCaml 中)的这种特殊处理或角色是什么?如果允许,&lt;$&gt; 应该做什么(编辑)?

试图通过创建像op_DollarDollar 这样的函数来欺骗系统,但不会成功,语法检查也在调用站点上完成。虽然作为一个例子,这个技巧确实适用于其他(合法的)运营商:

// works
let inline op_BarQmark f y = f y
let test = 
    let add x = x + 1
    add |? 12

// also works:
let inline op_Dollar f y = f y
let test = 
    let add x = seq { yield x + 1 }
    add $ 12

【问题讨论】:

  • 是的,这与我们无法在 F# 中定义标准的 &lt;$&gt; 运算符相同。我们应该提交请求以允许这些运算符。
  • : 也在名单上。 $:
  • @guy,对于: 我有点理解,因为:&gt;:?&gt; 可能不应该被覆盖。我可以对:: 说同样的话,但是由于@ 是可覆盖的并且.. 也是如此(令人惊讶,但确实如此),我只会假设:: 不是因为与冒号相关的受保护运算符。
  • @guy,什么是“标准”&lt;$&gt; 运算符,什么标准?
  • 这是我等待kvb回答的问题

标签: f# operator-overloading dollar-sign


【解决方案1】:

F# specification 在这一点上存在一些不一致之处。 F# 规范的第 3.7 节将符号运算符定义为

regexp first-op-char = !%&*+-./<=>@^|~ 
regexp op-char       = first-op-char | ? 

token quote-op-left  =
    |  <@ <@@  

token quote-op-right  =
    |  @> @@>  

token symbolic-op  =
    | ?
    | ?<-
    | first-op-char op-char*
    | quote-op-left
    | quote-op-right

(并且$ 在第 3.6 节中也没有作为符号关键字出现),这表明编译器接受 ( $ ) 作为运算符是错误的。

但是,第 4.4 节(涵盖运算符优先级)包括以下定义:

infix-or-prefix-op :=
    +,  -, +., -., %, &, && 

prefix-op :=
    infix-or-prefix-op
    ~ ~~ ~~~             (and any repetitions of ~)
    !OP                  (except !=) 

infix-op :=
    infix-or-prefix-op  
    -OP +OP || <OP >OP = |OP &OP ^OP *OP /OP %OP !=  
                         (or any of these preceded by one or more ‘.’) 
    := 
    :: 
    $ 
    or 
    ?

并且下面的优先级和关联性表确实包含$(但没有迹象表明$ 可以在任何更长的符号运算符中作为一个字符出现)。考虑提交一个错误,以便规范可以以一种或另一种方式保持一致。

【讨论】:

  • 谢谢。我知道你会有一个明确的答案。
  • 假期愉快。 :)
猜你喜欢
  • 2012-10-30
  • 2011-07-17
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 2014-08-23
  • 2018-05-17
相关资源
最近更新 更多