主要观点:探讨了有原则的临时多态性(principled ad-hoc polymorphism),包括相干性(coherence)、典范性(canonicity)等概念,以及不同语言在这些方面的选择和面临的问题,如 Haskell 允许孤儿实例和重叠实例,Purescript 禁止孤儿实例等,还讨论了摒弃典范性带来的问题,如类型需跟踪对应实例等。
关键信息:
- 相干性:程序的不同有效类型推导应导致相同的动态语义。
- 典范性:最多为一个绑定类型对编译一个实例,包括孤儿实例和重叠实例。
- 不同语言在典范性方面的选择:Haskell 允许,Purescript 禁止孤儿实例,Rust 不允许孤儿实例(除边缘情况)且目前不允许重叠实例等。
- 摒弃典范性的问题:类型需跟踪对应实例、在主流语言中研究较少、路径独立性证明困难、隐式参数无法推断等。
重要细节: - 在有原则的临时多态性中,子表达式可被赋值类型,函数体中访问的所有类型相关信息应反映在其类型签名中。
- 不同语言在术语使用上有所差异,如 Haskell 和 Purescript 用“类型类”和“实例”,Rust 用“特质”和“实现”等。
- 标准库中常见函数有隐式和显式参数的版本,如 Haskell 的
sort和sortBy。 - 非典范性语言如 Scala 和 OCaml 中孤儿实例和重叠实例的情况。
- 路径独立性证明中在不同约束下选择实例的困难及解决方法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。