OCaml:类型检查对象

时间:2009-09-15 18:37:11

标签: object ocaml instanceof typechecking

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

4 个答案:

答案 0 :(得分:7)

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

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

let foo x = x#bar

答案 1 :(得分:5)

"Matching Objects With Patterns"上讨论Lambda the Ultimate(本文使用Scala作为语言,因此不会回答您的问题)。更相关的Ocaml mailing list thread表示没有对象的RTTI /安全预测。

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

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

名为(pattern) matching

有人写了extension,允许向下/向上转换Ocaml对象。

答案 2 :(得分:1)

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

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

答案 3 :(得分:-1)

有点偏离主题,但是the OPA language(从OCaml的某些方面大量吸取),允许相当于对象上的模式匹配。所以这很可行。