如果我有一个物体,我该如何确定它的类型? (OCaml是否等同于Java的 instanceof 运算符?)

有帮助吗?

解决方案

OCaml具有对象的结构类型,而不是Java中的主格类型。因此,对象的类型基本上由其方法确定(并且仅确定)。 OCaml中的对象可以直接创建,而无需通过类似的东西。

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

let foo x = x#bar

其他提示

讨论了“匹配带模式的对象” Lambda the Ultimate 上(该论文使用Scala作为语言,所以不会回答你的问题)题)。更相关的 Ocaml邮件列表主题表示对象没有RTTI /安全预测。

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

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

名为(模式)匹配

有人写过扩展名允许向下/向上转换Ocaml对象。

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

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

有点偏离主题,但 OPA语言(其中大量使用OCaml的某些方面) ,允许相当于对象上的模式匹配。所以这很可行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top