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
Syntax 如何声明全局级别的可重载运算符?_Syntax_F#_Operators - Fatal编程技术网

Syntax 如何声明全局级别的可重载运算符?

Syntax 如何声明全局级别的可重载运算符?,syntax,f#,operators,Syntax,F#,Operators,基于: 我想定义一些操作符,比如+但是让我们调用-|-,比如have let a = -|- 1 let b = 1 -|- 1 let c = 1 -|- 1 1 1 1 至少有两行第一行适用于+但我如何才能像这样声明自己的运算符?那么有区别的并集呢: type RHS = |One of int |Two of int * int ... 然后 称之为: 1 -|- One(1) 1 -|- Two(1,1) .... 那么,一个受歧视的工会呢 type RHS = |One of

基于:

我想定义一些操作符,比如+但是让我们调用-|-,比如have

let a = -|- 1
let b = 1 -|- 1
let c = 1 -|- 1 1 1 1

至少有两行第一行适用于+但我如何才能像这样声明自己的运算符?

那么有区别的并集呢:

type RHS = 
|One of int
|Two of int * int
...
然后

称之为:

1 -|- One(1)
1 -|- Two(1,1)
....

那么,一个受歧视的工会呢

type RHS = 
|One of int
|Two of int * int
...
然后

称之为:

1 -|- One(1)
1 -|- Two(1,1)
....

一般来说,我认为没有一种简单的方法可以做到这一点。您可能会使用一个内联操作符和一组静态成员约束来覆盖您想要的一些情况,但我认为它不会非常优雅

但是,对于某些运算符名称,您可以定义一个单独的前缀和中缀版本,其中包括前两种情况:

// Prefix version of the operator (when you write e.g. '+. 10')
let (~+.) a = a * 10
// Infix version of the operator (when you write e.g. '1 +. 10')
let (+.) a b = a + b

// Sample use
+. 10
10 +. 20
你仍然不能写10+。20 30 40,因为那样你就需要一个超负荷的中缀操作符

值得注意的是,不能对所有运算符名称都这样做。以下是中缀运算符允许的运算符名称的语法定义:

中缀或前缀op:= +、-、+、-、%、&&&

前缀op:= 中缀或前缀op ~~~~~~~~~~~和任何重复的~       !除了=


PS:我通常不太喜欢自定义运算符——在某些情况下,它们很好,但很难发现它们,因为你在智能意义上看不到它们,除非你使用标准运算符进行数值计算,否则通常很难理解它们的意思。所以我可能会考虑其他的方法……P> >我不认为有一个简单的方法可以做到这一点。您可能会使用一个内联操作符和一组静态成员约束来覆盖您想要的一些情况,但我认为它不会非常优雅

但是,对于某些运算符名称,您可以定义一个单独的前缀和中缀版本,其中包括前两种情况:

// Prefix version of the operator (when you write e.g. '+. 10')
let (~+.) a = a * 10
// Infix version of the operator (when you write e.g. '1 +. 10')
let (+.) a b = a + b

// Sample use
+. 10
10 +. 20
你仍然不能写10+。20 30 40,因为那样你就需要一个超负荷的中缀操作符

值得注意的是,不能对所有运算符名称都这样做。以下是中缀运算符允许的运算符名称的语法定义:

中缀或前缀op:= +、-、+、-、%、&&&

前缀op:= 中缀或前缀op ~~~~~~~~~~~和任何重复的~       !除了=


PS:我通常不太喜欢自定义运算符——在某些情况下,它们很好,但很难发现它们,因为你在智能意义上看不到它们,除非你使用标准运算符进行数值计算,否则通常很难理解它们的意思。所以我也许会考虑其他的方法……谢谢你的建议,但我的水平不一样。我不喜欢let a=1-|-Zero的外观,我想要-|-1。所以也许这是不可能的,我只是想知道这是否可能。谢谢你的建议,但这并不是我想要达到的水平。我不喜欢let a=1-|-Zero的外观,我想要-|-1。所以也许这是不可能的,我只是想知道这是否可能。哇!老实说,这正是我想要达到的目标。谢谢。我刚才在看你之前的问题,我想是的…:-。我添加了一个允许的操作符名称列表。但是我不能使用一些,就像我不能使用let inline一样~^是的,你可以使用的操作符的数量非常有限,而且我不完全清楚什么才是真正有效的…@TomasPetricek:我从来都不明白操作符缺少Intellisense工具提示。对那些感兴趣的人来说,有。哇!老实说,这正是我想要达到的目标。谢谢。我刚才在看你之前的问题,我想是的…:-。我添加了一个允许的操作符名称列表。但是我不能使用一些,就像我不能使用let inline一样~^是的,你可以使用的操作符的数量非常有限,而且我不完全清楚什么才是真正有效的…@TomasPetricek:我从来都不明白操作符缺少Intellisense工具提示。对那些感兴趣的人来说,有。