5

レコードとタプルの間に、構文上の違いだけではない違いはありますか?

パフォーマンスに違いはありますか?

タプルとレコードの実装は同じですか?

タプルを使用して実行できるが、レコードを使用して実行できない(およびその逆の)例はありますか?

4

2 に答える 2

20

モジュロ構文はほとんど同じです。主なセマンティックの違いは、タプルが構造型であるのに対し、レコードは名義型であるということです。これは、たとえば、タプルが再帰できないのに対し、レコードは再帰的である可能性があることを意味します(少なくとも、-rectypesオプションがない場合)。

type t = {a : int, b : unit -> t}  (* fine *)
type u = int * (unit -> u)         (* error *)

さらに、レコードには変更可能なフィールドを含めることができますが、タプルにはできません。

FWIW、OCamlの姉妹言語SMLでは、タプルレコードです。つまり、SMLでは(a、b、c)は{1 = a、2 = b、3 = c}の単なる構文糖衣であり、レコードも構造型です。

于 2012-05-07T12:52:49.060 に答える
12

float-onlyレコードまたは配列のfloatsフィールドはボックス化されずに格納されますが、そのような最適化はタプルには適用されません。多数のfloatを格納し、floatのみを格納する場合は、レコードを使用することが重要です。また、floatとその他の混合データ構造を分割して、内部のfloatのみのレコードを作成することで利益を得ることができます。

その他の違いはタイプレベルであり、Andreasによってすでに説明されています。レコードは生成的ですが、タプルはすでに存在し、構造的なセマンティクスを持っています。多態的なアクセサを備えた構造レコードが必要な場合は、オブジェクトタイプを使用できます。

于 2012-05-07T20:57:55.633 に答える