我有3种类型,A,B,和C在F#。有两种类型,A并且B我没有能力为其修改代码。类型C是我控制的类型。
我要编写重载运算符,例如-
type C () =
static member (><) (alpha : A) (beta : B) : C = zeta alpha beta
static member (><) (beta : B) (alpha : A) : C = omega alpha beta
Run Code Online (Sandbox Code Playgroud)
当我尝试调用运算符时,编译会发出以下错误-
Error FS0043 None of the types 'A, B' support the operator '><'
我如何解决该问题,以便可以使用不受类型定义控制的操作数来定义重载运算符?我控制的唯一类型是结果类型C!
由于C未出现在输入参数中,因此它将不起作用,至少只要在使用特征调用进行重载解析时不考虑类型扩展即可。
因此,您必须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
Run Code Online (Sandbox Code Playgroud)
注意:如果需要,您可以在内部使用其他运算符名称
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |