首页 > 解决方案 > 如何使用无法在 F# 中控制其类型定义的操作数定义重载运算符?

问题描述

我在 F# 中有 3 种类型、 AB和。C两种类型,AB没有能力修改代码。类型C是我控制的类型。

我用编写重载运算符,例如 -

type C () =
    static member (><) (alpha : A) (beta : B) : C = zeta alpha beta
    static member (><) (beta : B) (alpha : A) : C = omega alpha beta

当我尝试调用运算符时,编译会发出以下错误 -

Error FS0043 None of the types 'A, B' support the operator '><'

如何解决此问题,以便我可以使用我无法控制其类型定义的操作数定义重载运算符?我控制其定义的唯一类型是结果类型,C

标签: f#

解决方案


由于C没有出现在输入参数中,因此它不会起作用,至少只要在使用 trait 调用的重载解析中不考虑类型扩展。

因此,您必须C在全局级别包含和定义运算符:

type A = A
type B = B

type C () = class end

let zeta  _ _ = C ()
let omega _ _ = C ()

type C with
    static member (><) (_:C, alpha : A) = fun (beta  : B) -> zeta alpha beta : C
    static member (><) (_:C, beta  : B) = fun (alpha : A) -> omega alpha beta: C

let inline (><) x y = (Unchecked.defaultof<C> >< x) y

// Test
let x = A >< B
// val x : C

注意:如果需要,您可以在内部使用不同的运算符名称


推荐阅读