类型类与模块:两种抽象,别再混为一谈
来源: sm2n.ca
概述
文章区分了两类长期被混淆的语言特性:类型类的目标是特设多态,也就是运算符重载与按类型分派,服务于小规模编程;模块系统的目标是模块化抽象,也就是依赖注入、封装与信息隐藏,服务于大规模编程。两者都能勉强模拟对方,但通常不是最优解。
核心要点
- 特设多态让你在不同类型上复用同一符号,例如 + 既能加整数也能加浮点向量。
- 模块化的重点是显式表达程序分解,让各部分互相隐藏内部,从而降低整体推理成本。
- 类型类可以附带法则,例如加法结合律,并用属性测试或证明来验证实现是否符合语义。
- 用类型类做模块化会失去组合性:接口必须依附某个类型,无法内联声明,也无法嵌套在别的接口里。
- 每个函数都要重复写 trait bound,签名因此变得冗长;实例搜索也常带来可观的编译期开销。
- 反过来在 OCaml 里做特设多态的办法通常就是不做,靠词法作用域导入换取更机械可懂的代码。
- 作者建议语言设计者优先支持模块化抽象,他认为它比特设多态更有价值。
金句
类型类和模块只是达成目的的手段,一个服务于大规模编程,一个服务于小规模编程。
👍 0
👎 0
← 返回 Lobsters 首页