F#:通常不应重新定义'&'运算符

Joe*_*ler 6 f# operators

当从有限的单字符操作符定义自定义运算符时,可以同时使用中缀和前缀运算符(+ - % &)我决定使用&符号,因为它是我迄今为止没有使用的那些运算符中唯一的一个我的F#代码.我推断,因为在F#中使用相当有限,重新定义它对于使用我的库的人来说是最不容易的.

但是,当我这样做时,我收到编译器警告:

通常不应重新定义'&'运算符.考虑使用不同的运营商名称.

我的问题是,为什么这个看似罕见的运算符会生成此警告消息,而常用的运算符如加号和减号则不会?另外,我应该多么认真地接受这个警告?

Tom*_*cek 8

在创建自定义运算符时,我通常更喜欢找到一个与任何现有F#运算符都不冲突的简单符号组合.确实,符号集非常有限,所以这并不总是可行的.但是,您可以定义类似的东西,-&-并且您经常可以选择一些反映运算符含义的组合.出于好奇,您的运营商的意义是什么?

无论如何,当我找不到一个好的运营商名称时,我认为这可能是我不应该使用自定义运营商的标志(毕竟,许多语言很容易在没有它们的情况下生活).我认为自定义运算符的主要用途可能是一些专门的数学东西.您通常可以a -&- b通过与流水线操作使用的函数(例如)替换运算符(例如a |> connectTo b).还有一个巧妙的技巧,允许您使用函数作为中缀运算符.

在这种情况下&,我认为如果你很好地使用了操作符并且你想要定义的操作符的行为与&符号的直觉相对应,则忽略警告是一个非常合理的选择.

编辑定义您自己的&运算符不会破坏&符号的其他用法(在模式匹配中).以下是和模式的示例:

// define custom & operator
let (&) a b = a + b

match 2 with
| num1 & num2 -> num1 + num2 // Still works fine
Run Code Online (Sandbox Code Playgroud)

和图案允许您匹配单个值agains多个图案在单个图案(在上面的例子中,我们只将其绑定到两个不同的值)