如果我有一个物体,我该如何确定它的类型? (是否有一个OCaml等同于Java的instanceof
运算符?)
答案 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
有人写了extension,允许向下/向上转换Ocaml对象。
答案 2 :(得分:1)
简而言之,您必须编码自己的RTTI机制。 OCaml不提供RTTI或向上/向下转换(后者部分是因为继承和子类型在OCaml中是正交的,而不是像在Java中那样统一)。
您可以使用字符串或多态变体来对类和对象中的类型信息进行编码。我相信LablGTK会做一些这样的事情,并提供一个实用程序库来支持对象标记和向上/向下转换。
答案 3 :(得分:-1)
有点偏离主题,但是the OPA language(从OCaml的某些方面大量吸取),允许相当于对象上的模式匹配。所以这很可行。