Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#'&';运算符通常不应重新定义_F#_Operators - Fatal编程技术网

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

F#'&';运算符通常不应重新定义,f#,operators,F#,Operators,当从有限的一组单字符运算符(可以是中缀运算符和前缀运算符(+-%&)中定义自定义运算符时,我决定使用与符,因为它是迄今为止我在F代码中唯一没有机会使用的运算符。我推断,既然&似乎在F#中有,重新定义它对使用我的库的人来说是最不容易混淆的 但是,当我这样做时,我会得到一个编译器警告: “&”运算符通常不应重新定义。考虑使用不同的操作符名称。< /P> 我的问题是,为什么这个看似罕见的运算符会生成此警告消息,而常用的运算符(如加号和减号)则不会生成此警告消息?另外,我应该多认真地对待这个警告?您将无

当从有限的一组单字符运算符(可以是中缀运算符和前缀运算符(
+-%&
)中定义自定义运算符时,我决定使用与符,因为它是迄今为止我在F代码中唯一没有机会使用的运算符。我推断,既然&似乎在F#中有,重新定义它对使用我的库的人来说是最不容易混淆的

但是,当我这样做时,我会得到一个编译器警告:

“&”运算符通常不应重新定义。考虑使用不同的操作符名称。< /P>
我的问题是,为什么这个看似罕见的运算符会生成此警告消息,而常用的运算符(如加号和减号)则不会生成此警告消息?另外,我应该多认真地对待这个警告?

您将无法调用使用byref参数的方法。这对你来说可能不是什么大问题

至于你关于“和模式”的问题,这里有一个简单的例子。但是,请注意,定义自己的一元
&
运算符不会以任何方式影响此行为

let (|Contains|_|) (s:string) (x:string) =
  if (x.Contains(s)) then Some() else None

match "test" with
| Contains "e" & Contains "s" -> printfn "Success!"
| _ -> ()
奇怪的是,我只看到您在定义一个二进制
(&)
运算符时提到的警告,而不是一元
(~&)
运算符

编辑


虽然我没有看到在规范中显式地调用它,但是看起来二进制
&
操作符被用作二进制
&
操作符的同义词。我想不重新定义此运算符的建议是存在的,因为它是一个短路运算符,但您的重载不能是。

在创建自定义运算符时,我通常更喜欢找到一个简单的符号组合,它不会与任何现有的F#运算符冲突。事实上,符号集非常有限,所以这并不总是可能的。但是,例如,您可以定义类似于
-&-
的内容,并且通常可以选择一些反映运算符含义的组合。出于好奇,你的接线员是什么意思

无论如何,当我找不到一个好的操作符名称时,我认为这是一个符号,也许我不应该使用自定义操作符(毕竟,许多语言很容易就没有它们)。我认为自定义运算符的主要用途可能是一些专门的数学知识。您通常可以使用与管道连接一起使用的函数g替换运算符(例如,

a-&b
)(例如,
a |>connecttob
)。还有一个允许您将函数用作中缀运算符的

&
的情况下,我认为如果您很好地使用了操作符,并且您想要定义的操作符的行为与
&
符号的直觉一致,那么忽略警告是一个非常合理的选择

编辑定义自己的
&
操作符不会中断
&
符号的其他用法(在模式匹配中)。以下是和模式的示例:


and模式允许您将单个值与单个模式中的多个模式进行匹配(在上面的示例中,我们只是将其绑定到两个不同的值)

Hmm,我所知道的单个
&
符号的唯一用途是计算可变值的地址。链接页面上说它也“用于and模式”但是我还没有找到一个例子来说明这意味着什么。为了回答你关于我在做什么的问题,我正在尝试编写一个用于HTML生成的DSL,我想为一些非常常见的东西提供一个方便的快捷方式。运算符的前缀版本从字符串创建文本节点,中缀版本将文本节点包装在列表中,并将其传递给作为左侧参数的函数。这是一个我希望F#允许隐式施法的场合。林克现在死了。+1-回答很好,几乎和托马斯的一样。恐怕我不得不同意他稍微多说一点细节和酷炫的中缀函数技巧。而且我喜欢他的书。
// define custom & operator
let (&) a b = a + b

match 2 with
| num1 & num2 -> num1 + num2 // Still works fine