OCaml:类型检查对象
-
07-07-2019 - |
题
如果我有一个物体,我该如何确定它的类型? (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的某些方面) ,允许相当于对象上的模式匹配。所以这很可行。
不隶属于 StackOverflow