【问题标题】:Can you define your own operators in F#?您可以在 F# 中定义自己的运算符吗?
【发布时间】:2010-02-05 22:19:51
【问题描述】:

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

如果是这样,有人可以给我一个例子吗?我搜索了一下,但没有找到任何东西。

【问题讨论】:

  • 供您将来参考 Joan——这个概念称为运算符重载。如果您使用 Google F# 和运算符重载,您会发现很多关于该主题的内容。

标签: f# operators


【解决方案1】:

是的:

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

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

您可以像我在上面所做的那样创建自己的 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)

在这种情况下,您不需要预先定义一个 let-bound 函数来使用该运算符; 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

【讨论】:

猜你喜欢
  • 2010-12-03
  • 2021-08-02
  • 2014-05-21
  • 2011-04-30
  • 2015-09-22
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多