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

cnd*_*cnd 1 syntax f# operators

基于:是否可以为不同的参数计数定义同名运算符?

我想定义一些运算符,+ 但让我们调用-|-例如

let a = -|- 1
let b = 1 -|- 1
let c = 1 -|- 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

至少有2条第一行可以使用+但是如何声明自己的运算符呢?

Tom*_*cek 5

我认为通常没有一种直接的方法可以做到这一点.你可以使用inline一个混合了静态成员约束的运算符来覆盖你想要的一些情况,但我认为它不会很优雅.

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

// 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
Run Code Online (Sandbox Code Playgroud)

你仍然无法写10 +. 20 30 40,因为那时你需要一个重载的中缀运算符.

值得注意的是,您不能对所有运营商名称执行此操作.以下是中缀运算符的允许运算符名称的F#规范中的语法定义:

infix-or-prefix-op:=
      +, - ,+., - .,%,&,&&

prefix-op:=
      infix-or-prefix-op
      ~~~~~~(以及〜的任何重复)
      !OP(除了!=)

PS:我一般不是自定义操作员的忠实粉丝 - 在某些情况下,它们很好,但很难发现(你没有在IntelliSense中看到它们),除非你使用标准数字计算,通常很难理解它们的含义.所以我可能会考虑其他方法......

  • 我只是看着你以前的问题,我想是这样的...... :-).我添加了一个允许的操作员名称列表. (2认同)
  • @TomasPetricek:我从未理解运营商缺乏Intellisense工具提示.对于那些感兴趣的人,有[workarounds](http://stackoverflow.com/a/12182640/162396). (2认同)