您可以在F#中定义自己的运算符吗?

问题描述 投票:11回答:1

是否可以在F#中定义自己的运算符?

如果可以,可以给我一个例子吗?我进行了短暂搜索,但找不到任何内容。

f# operators
1个回答
30
投票

是:

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

the docs中列出了可在F#运算符中使用的字符。它们是!%&*+-./<=>@^|~,对于第一个字符之后的任何字符?。优先级和固定性由运算符的第一个字符确定(请参阅规范)。

您可以像上面一样创建自己的让绑定运算符,在这种情况下,它们的作用就像让让绑定函数一样。您也可以将它们定义为类型的成员:

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

let w = (Wrapper 1) +! (Wrapper 2)

在这种情况下,您不需要预先定义一个让函数绑定的函数即可使用运算符; F#将在类型上找到它。您可以使用内联定义来充分利用此优势:

let inline addSpecial a b = a +! b
let w2 = addSpecial w (Wrapper 3)

进一步讲,您还可以使类型上的运算符也内联,以便可以在类的更多实例上使用它们:

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
© www.soinside.com 2019 - 2024. All rights reserved.