Guarded Methods in OCaml
4 hours ago
- 受保护方法仅对特定方法在接收者上附加约束,仅当接收者满足这些约束时才允许调用。
- OCaml 本身不支持受保护方法,但可以通过类型相等见证来编码实现。
- 问题在于类级别的泛型约束过于宽泛时,方法级别的约束更为灵活。
- 存在三种方法:将方法移到类外部、扩展方法以及受保护方法,最后一种最符合理念。
- 该编码使用自定义的 eq 类型,带有 Refl 构造器,表示类型相等。
- 例如,列表的列表上的 flatten 方法需要见证 ('a, 'b list) eq。
- sum 方法可以通过 ('a, int) eq 约束为 int 类型。
- 使用不兼容类型应用受保护方法会导致编译时错误,确保类型安全。
- 虽然这种编码较为冗长,但它展示了相等见证的实际用途,并保留了消息传递语义。