ocaml - 为什么 OCaml 对多态变体使用子类型化?

标签 ocaml subtyping

我刚刚读到 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/

相关文章:

f# - 为什么 OCaml/F# 中的函数默认不是递归的?

unix - 错误: Unbound module Unix in Ocaml

performance - 如何构建更快的 Queue 实现?

OCaml:更高种类的多态性(对模块进行抽象?)

ocaml - OCaml 模块的菱形继承(钻石问题)

java - 逆变方法参数类型

java - Java 中的子类型会导致意外的输出

rust - Rust 中的类子类型化

kotlin - 任何可提升到 `Unit` 的 λ 密码域?

Kotlin 在 Jackson 中密封了类子类型