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 はすべての値の実行時の型情報を持ちません (Jeffrey の回答で既に述べたように)。型システムは完全に静的な型システムとして設計されているため、これは安全です。A と B は OCaml では型ではなく、コンストラクタです。また、コンストラクターは実行時に区別できます。ただし、1 つのタイプのコンストラクター間のみです。そのため、OCaml コンパイラは、実行時にパターン マッチングを実装するために必要な最小限の機能のみを表します。

于 2013-01-31T08:13:53.803 に答える
2

いいえ、OCaml は実行時の型情報を持ちません (言うまでもなく)。タイプはサブタイプの関係に参加していないため、ダウンキャストは行われません。(サブタイピングに参加する型については、OCaml はダウンキャストを許可しません。) はい、コンパイル時に安全性をチェックできるように言語が慎重に定義されているため、コードは安全です。

于 2013-01-31T07:51:01.683 に答える