主要观点:
- 讨论 Rust 特质(traits),指出其存在致命缺陷,即特质实现必须在定义类型的 crate 或定义特质的 crate 中,导致孤儿实例(orphan instance)问题,可能出现多个特质实现,引发编译器选择困难和代码行为不一致。
- 引入全局一致性(global coherence)和局部一致性(local coherence)的概念,全局一致性要求一个类型只有一个特质实现,以确保编译器能正确选择实现,避免重叠实现;局部一致性则允许在局部范围内有重叠实现,但需注意类型检查和稳定性。
- 介绍 COCHIS 论文,其提出的“相干隐式”(Calculus of Coherent Implicits)试图解决隐式实现的稳定性和相干性问题,通过新的构造(查询、规则函数、规则应用)来实现隐式特质,并举例说明如何用其复制特质行为。
- 指出隐式实现虽有优势,但仍存在一些问题,如需要更多重复、失去特质的一些正确性保证、影响代码可读性等,且解决这些问题仍有很多设计工作要做。
关键信息:
- Rust 特质的问题:实现位置限制导致孤儿实例问题,可能有多个实现引发编译器选择困难和代码行为不一致。
- 全局一致性:一个类型只有一个特质实现,确保编译器能正确选择,利于编译器和语言使用者,但检查实现是否重叠在实践中不可行。
- 局部一致性:在局部范围内允许重叠实现,通过 COCHIS 的构造实现,如查询、规则函数、规则应用等。
- COCHIS:提出“相干隐式”,通过新构造实现隐式特质,举例说明其在排序等操作中的应用,注重相干性和稳定性,但也存在一些限制和需要解决的问题。
- 隐式实现的问题:需要更多重复、失去正确性保证、影响代码可读性,解决这些问题仍有很多设计工作要做。
重要细节:
- 在 Rust 代码中,实现特质时若类型在不同 crate 中会出现编译错误,如实现
BTraitforA时的错误信息。 - 全局一致性确保编译器能明确选择实现,而局部一致性在局部范围内允许重叠实现但需注意作用域。
- COCHIS 的构造如查询查找最近的隐式值、规则函数绑定隐式值、规则应用提供值等,与 lambda 演算相似。
- 隐式实现的问题如在
Set数据结构中,无法确定用于构造Set的Ord实现,可能导致union操作出错,需要通过参数化Set来解决。 - 隐式实现的问题如代码可读性受影响,寻找隐式实现的位置更困难,即使有智能 IDE 也存在限制。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。