Object OCaml:类型检查对象

Object OCaml:类型检查对象,object,ocaml,instanceof,typechecking,Object,Ocaml,Instanceof,Typechecking,如果我有一个对象,我如何确定它的类型?(是否有一个OCaml等价于Java的instanceof操作符?有关于的讨论(本文使用Scala作为语言,因此不会回答您的问题)。一个更相关的例子表明对象没有RTTI/safe向下转换 对于代数(非对象)类型,您显然有: match expr with Type1 x -> x Type2 (x,y) -> y 叫 有人编写了一个允许向下/向上转换Ocaml对象的脚本。Ocaml具有对象的结构化类型,而不是Java中的命名类型。所以

如果我有一个对象,我如何确定它的类型?(是否有一个OCaml等价于Java的
instanceof
操作符?

有关于的讨论(本文使用Scala作为语言,因此不会回答您的问题)。一个更相关的例子表明对象没有RTTI/safe向下转换

对于代数(非对象)类型,您显然有:

match expr with 
  Type1 x -> x
  Type2 (x,y) -> y


有人编写了一个允许向下/向上转换Ocaml对象的脚本。

Ocaml具有对象的结构化类型,而不是Java中的命名类型。所以一个对象的类型基本上是由它的方法决定的。OCaml中的对象可以直接创建,而无需经过类之类的操作

您可以编写要求其参数对象具有特定方法(并且这些方法具有特定类型)的函数;例如,以下方法接受的参数是具有方法“bar”的任何对象:


简而言之,您必须对自己的RTTI机制进行编码。OCaml不提供RTTI或上/下转换(后者的部分原因是继承和子类型在OCaml中是正交的,而不是像Java中那样统一)


您可以使用字符串或多态变量对类和对象中的类型信息进行编码。我相信LablGTK可以做到这一点,并提供了一个实用程序库来支持对象标记和上/下转换。

有点离题,但是(它在很大程度上借鉴了OCaml的某些方面),允许在对象上进行模式匹配。所以这是非常可行的。

我很难让它发挥作用。我已经对一种类型内的值进行了模式匹配,但没有对多个类型进行模式匹配。对象和代数类型之间有区别。大多数人似乎更喜欢避免使用Ocaml的对象,而使用函子+代数类型来实现泛型。您能发布一些代码吗,因为通常您在处理对象时知道对象类型
let foo x = x#bar