从技术上讲,OCaml的对象并不真正支持通常意义下的子类型,而是采用了行多态性。使用行多态性相比子类型有很多优势,特别是它既更具表现力,又与类型推导更加协调(子类型和类型推导完全不搭配)。但是,将结构子类型或行多态性应用于所有记录的主要问题在于它需要一个更为复杂的运行时实现,并且因此成本更高。简单的记录可以轻松地转换为普通元组,字段访问只需要索引即可。而结构子类型或行多态性则需要能够透明地“切片”一个对象,即以随机字段被移除的超类型视图查看它。一般来说,这要么需要通过哈希查找字段(例如Ocaml的对象),要么需要利用“证据传递”技术,在函数或其任何被调用者中使用的每个字段的索引都必须作为隐藏参数传递给实际记录之外(例如SML#就是这样做的)。无论如何,Ocaml确实具有多态记录,它们只是被称为对象。但如果您不需要,可以忽略它们周围的所有类混乱。
记录子类型在类型学的角度来看是相当危险的。假设您有一个包含三个字段a,b和c的记录。现在您想要创建一个只包含a和c两个字段的记录。编译器无法知道您使用的类型,直到它完成对整个记录的读取。最终,在没有完全读取记录的情况下,如果您犯了错误(例如忘记了b字段),编译器也无法提供帮助。我完全认为这种观点是值得争议的,但我认为这就是编写OCaml代码的人们的想法。