为什么允许$,但$$或< $>不允许作为运营商(FS0035)和什么让$特别?

时间:2016-12-23 19:23:56

标签: f# operator-overloading dollar-sign

自定义运算符中允许

$,但如果您尝试使用$$<$>或例如~$%作为运算符名称,则会收到以下错误:

  

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

$显然名称中还有“$”,但有效,为什么? 即:

let inline ( $ ) f y = f y

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

我在网上示例中看到$很多,显然是一种特殊的运算符。 $(即在Haskell或OCaml中)的这种特殊处理或角色是什么?<$>如果允许(编辑)应该做什么?

尝试通过创建像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

1 个答案:

答案 0 :(得分:4)

在这一点上,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 
    ?

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