8

如果我有一个对象,我如何确定它的类型?(是否有与 Javainstanceof运算符等效的 OCaml?)

4

4 回答 4

7

OCaml 具有对象的结构类型,而不是 Java 中的主格类型。所以一个对象的类型基本上是由它的方法决定的(也只是决定的)。OCaml 中的对象可以直接创建,无需通过类之类的东西。

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

let foo x = x#bar
于 2009-09-15T19:49:37.263 回答
5

Lambda the Ultimate上讨论了“将对象与模式匹配”(该论文使用 Scala 作为语言,因此不会回答您的问题)。一个更相关的Ocaml 邮件列表线程表明对象没有 RTTI/安全向下转换。

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

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

称为(模式)匹配

有人确实编写了一个扩展,允许向下/向上转换 Ocaml 对象。

于 2009-09-15T18:43:10.520 回答
1

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

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

于 2009-09-16T02:11:56.973 回答
-1

有点跑题了,但是OPA 语言(它大量借鉴了 OCaml 的某些方面)允许对对象进行模式匹配。所以还是蛮可行的。

于 2010-01-16T10:48:13.183 回答