f# - 如何使用无法在 F# 中控制其类型定义的操作数定义重载运算符?
问题描述
我在 F# 中有 3 种类型、 A
、B
和。C
两种类型,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
当我尝试调用运算符时,编译会发出以下错误 -
Error FS0043 None of the types 'A, B' support the operator '><'
如何解决此问题,以便我可以使用我无法控制其类型定义的操作数定义重载运算符?我控制其定义的唯一类型是结果类型,C
!
解决方案
由于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
注意:如果需要,您可以在内部使用不同的运算符名称
推荐阅读
- php - $_GET 未获取 URL 数据
- python - Qt:停靠小部件如何获得其初始大小?
- vba - 如何模拟箭头键被按下并按住然后释放?VBA
- swift - 无法保存 EKEvent,因为日历缺少默认组织者
- pandas - 我的 .loc 在应该工作的地方出错:“无法从重复的轴重新索引”
- electron - 如何使用 Mocha 测试需要 Node API 的自定义模块?“无法读取未定义的属性‘要求’”
- macros - 如何让这个公式只填写空白单元格?
- akka - 带有临时队列的 Alpakka JMS 请求/响应 - 开箱即用?
- android - 使用“仅 GPS”模式或“Wifi 网络”时,FusedLocationProviderClient 不起作用
- django - 使用 SQL 数据库和 NoSQL 数据库