在ocaml中,假设我们有:
type t = A of int | B of string
let x = [A 5; B "y"]
然后,我们可以迭代列表,并使用match语句来决定如何处理A或B.
在java中,我们可以:
ArrayList<Object> x = new ArrayList<Object>();
x.add(new Integer(5));
x.add("y");
在数组列表迭代中,我们必须使用instanceof和downcast来处理数据。
在内部,ocaml将运行时类型信息作为java传递,并且类型匹配语句的工作方式类似于java instanceof-downcast,但是类型是安全的,因为没有办法可以编写
if (element instanceof Integer) {
String e = (String) element;
}
答案 0 :(得分:2)
不,OCaml不携带任何运行时类型信息(可以说)。由于类型不参与子类型关系,因此不会进行向下转换。 (对于参与子类型的类型,OCaml不允许向下转换。)是的,代码是安全的,因为语言是经过精心定义的,因此可以在编译时检查安全性。
答案 1 :(得分:2)
不,是的。一般来说,OCaml不会为每个值携带任何运行时类型信息(正如Jeffrey的答案中已经说过的那样)。这是安全的,因为类型系统的设计是一个完全静态的类型系统。 A和B不是OCaml中的类型,它们是构造函数。构造函数在运行时是可区分的。但只在一种类型的构造函数之间。因此,OCaml编译器仅表示运行时的最小值,这是实现模式匹配所必需的。