3

在 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;
}
4

2 回答 2

2

不,OCaml 不携带任何运行时类型信息(可以说)。没有向下转换,因为类型不参与子类型关系。(对于确实参与子类型化的类型,OCaml 不允许向下转换。)是的,代码是安全的,因为语言是经过仔细定义的,因此可以在编译时检查安全性。

于 2013-01-31T07:51:01.683 回答
2

不和是。一般来说,OCaml 不会为每个值携带任何运行时类型信息(正如 Jeffrey 的回答中已经说过的那样)。这是安全的,因为类型系统设计为完全静态的类型系统。A 和 B 不是 OCaml 中的类型,它们是构造函数。并且构造函数在运行时是可区分的。但仅限于一种类型的构造函数之间。因此,OCaml 编译器仅代表运行时的最低限度,这是实现模式匹配所必需的。

于 2013-01-31T08:13:53.803 回答