有原则的特设多态性

主要观点:探讨了有原则的临时多态性(principled ad-hoc polymorphism),包括相干性(coherence)、典范性(canonicity)等概念,以及不同语言在这些方面的选择和面临的问题,如 Haskell 允许孤儿实例和重叠实例,Purescript 禁止孤儿实例等,还讨论了摒弃典范性带来的问题,如类型需跟踪对应实例等。
关键信息

  • 相干性:程序的不同有效类型推导应导致相同的动态语义。
  • 典范性:最多为一个绑定类型对编译一个实例,包括孤儿实例和重叠实例。
  • 不同语言在典范性方面的选择:Haskell 允许,Purescript 禁止孤儿实例,Rust 不允许孤儿实例(除边缘情况)且目前不允许重叠实例等。
  • 摒弃典范性的问题:类型需跟踪对应实例、在主流语言中研究较少、路径独立性证明困难、隐式参数无法推断等。
    重要细节
  • 在有原则的临时多态性中,子表达式可被赋值类型,函数体中访问的所有类型相关信息应反映在其类型签名中。
  • 不同语言在术语使用上有所差异,如 Haskell 和 Purescript 用“类型类”和“实例”,Rust 用“特质”和“实现”等。
  • 标准库中常见函数有隐式和显式参数的版本,如 Haskell 的sortsortBy
  • 非典范性语言如 Scala 和 OCaml 中孤儿实例和重叠实例的情况。
  • 路径独立性证明中在不同约束下选择实例的困难及解决方法。
阅读 26
0 条评论