我刚刚读到 row polymorphism以及如何将其用于可扩展记录和多态变体。
然而,Ocaml 对多态变体使用子类型化。为什么?它比行多态更强大吗?
最佳答案
OCaml 对多态变体(和对象,就此而言)使用行多态性和子类型化。 “开放”对象类型涉及行多态性 < m1 : t1; m2 : t2; .. >
(..
字面上是类型的一部分),或“开放”变体类型 [> `K1 of t1 | `K2 of t2 ]
.子类型用于能够在封闭的非多态类型之间进行转换 <m1:t1; m2:t2> :> <m1:t1>
或 [ `K1 of t1 ] :> [ `K1 of t1 | `K2 of t2 ]
.
行多态性允许避免需要有界量化来表达类型,例如“采用至少具有方法 m
的对象,并返回相同类型的对象”:因此子类型相当简单、明确,并且不能抽象了。相反,行多态更容易推断,并且会更好地与类型系统的其余部分配合使用。应该很少需要使用封闭类型和显式子类型,但这偶尔会很方便——特别是,保持类型封闭可以产生更容易理解的错误消息。
关于ocaml - 为什么 OCaml 对多态变体使用子类型化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16773384/