$
,但如果您尝试使用$$
,<$>
或例如~$%
作为运算符名称,则会收到以下错误:
错误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
答案 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 ?
并且下面的优先级和关联性表确实包含$
(但没有迹象表明$
可以在任何更长的符号运算符中显示为一个字符)。考虑提交一个错误,以便可以使规范以某种方式保持一致。