你能用F#定义自己的运算符吗?

Joa*_*nge 10 f# operators

有没有办法在F#中定义自己的运算符?

如果是这样,有人可以给我一个例子吗?我简短地搜索过,但找不到任何东西.

kvb*_*kvb 29

是:

let (+.) x s = [for y in s -> x + y]
let s = 1 +. [2;3;4]
Run Code Online (Sandbox Code Playgroud)

可以在F#运算符中使用的字符列在规范的3.7节中.它们是!%&*+-./<=>@^|~第一个之后的任何角色?.优先级和固定性由运算符的第一个字符决定(请参阅规范).

你可以像我上面那样创建你自己的let-bound运算符,在这种情况下它们就像let-bound函数一样工作.您还可以将它们定义为类型上的成员:

type 'a Wrapper = Wrapper of 'a with
  static member (+!)(Wrapper(x), Wrapper(y)) = Wrapper(x+y)

let w = (Wrapper 1) +! (Wrapper 2)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您不需要预先定义一个let-bound函数来使用该运算符; F#会在类型上找到它.您可以使用内联定义来充分利用这一优势:

let inline addSpecial a b = a +! b
let w2 = addSpecial w (Wrapper 3)
Run Code Online (Sandbox Code Playgroud)

更进一步,您可以将类型的运算符设置为内联,以便您可以在类的更多实例中使用它们:

type 'a Wrapper = Wrapper of 'a with
  static member inline (+!)(Wrapper(x), Wrapper(y)) = Wrapper(x+y)

let wi = (Wrapper 1) +! (Wrapper 2)
let wf = (Wrapper 1.0) +! (Wrapper 2.0)
let wi2 = addSpecial wi wi
let wf2 = addSpecial wf wf
Run Code Online (Sandbox Code Playgroud)

  • 第4.4节(http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html)提供了有关中缀运算符以及允许的字符的更多信息. (3认同)