f# - 如何使用无法在 F# 中控制其类型定义的操作数来定义重载运算符?

标签 f#

我有3种类型,A , B , 和 C在 F# 中。两种类型,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 !

最佳答案

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

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

关于f# - 如何使用无法在 F# 中控制其类型定义的操作数来定义重载运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56386708/

相关文章:

F# 管道和函数应用程序之间的神秘差异

asynchronous - 条件为 async 的异步计算表达式中的 'while'

f# - F# 是否有异步验证库?

types - F# 成员对返回类型的约束

f# - 为什么不允许 F# 记录具有 AllowNullLiteralAttribute?

f# - VSCode FSharp Interactive 终端中的奇怪字符

f# - F# 中的 AutoOpen 属性

.net - 无限并行功能

inheritance - F# 静态覆盖

c# - System.Numerics.dll 中的 BigInteger 类型和 FSharp.Core.dll 中的 BigInteger 类型有什么区别?