gpt4 book ai didi

f# - 为什么 $ 允许但 $$ 或 <$> 不允许作为运算符 (FS0035) 以及 $ 的特殊之处?

转载 作者:行者123 更新时间:2023-12-04 15:19:28 25 4
gpt4 key购买 nike

$允许在自定义运算符中使用,但如果您尝试使用 $$ , <$>或者例如 ~$%作为运算符(operator)名称,您将收到以下错误:

error FS0035: This construct is deprecated: '$' is not permitted as a character in operator names and is reserved for future use


$清楚 名称中还有“$” ,但有效,为什么?
IE。:
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

最佳答案

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
?


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

关于f# - 为什么 $ 允许但 $$ 或 <$> 不允许作为运算符 (FS0035) 以及 $ 的特殊之处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41306869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com