2013-03-06 18 views
14

"タイプとプログラミング言語"を読んで、私はクロージャーとレコードのサブタイプ化(第18章)を使ってオブジェクトの実装に感銘を受けました。 OCamlがレコードのサブタイプをサポートしていないという特別な理由はありますか(私はオブジェクトは分かりますが)。実際、私はこれをサポートする言語を見つけることができません。なぜOCamlはレコードのサブタイプをサポートしていませんか?

+1

SML#にはレコードのサブタイプがあります。 OCamlのオブジェクトは、サブタイプを持つレコードです。構造的なサブタイプは強力ですが、型エラーはしばしば潜在的です。したがって、OCamlユーザは通常、サブタイプなしで単純なレコードを好む。 – camlspotter

+0

SML#を指摘してくれてありがとう! SML#のレコードサブタイプとOCamlのオブジェクト構造タイプの間に違いはありますか? –

答えて

17

技術的には、OCamlのオブジェクトは実際には通常の意味でのサブタイプ化をサポートしていませんが、行多型です。サブタイプよりも行の多形性には多くの利点があります。特に、それはより表現力があり、型推論ではるかに優れています(サブタイプと型推論はまったく混ざりません)。

構造的サブタイプまたは行多型をすべてのレコードに使用する際の主な問題は、ランタイムの実装が大幅に増え、結果的に高価になるということです。フィールドのアクセスが単なる索引付けである単純なレコードを単純なタプルに変換することができる場合、構造的なサブタイプまたは行の多形性は、オブジェクトを透過的に「スライス」する能力を必要とする。一般に、これには、ハッシュ(Ocamlのオブジェクトなど)によるフィールドルックアップ、またはテクニックを渡す証拠があります。ここでは、関数またはその呼び出し先で使用されるすべてのフィールドのインデックスを、隠れ引数として渡す必要があります。実際のレコード(SML#がやっていることなど)。

いずれにしても、Ocaml の多型レコードを持っています。これらは多分オブジェクトと呼ばれます。しかし、もしあなたがそれを必要としないならば、あなたはそれらの周りのすべてのクラスの混乱を無視することができます。

+1

はい、クラスの混乱は私を止めたものでした。 OCamlの新機能ですが、オブジェクトシステムについてもっと学びたいと思っています。とにかく、お返事いただきありがとうございます! –

8

タイピングの観点から、レコードのサブタイプ化は非常に危険です。

たとえば、a、b、cの3つのフィールドを持つレコードがあるとします。また、aとcの2つのフィールドだけでレコードを作成したいとします。コンパイラは、レコード全体の読み込みが終了するまで、あなたが使用しているタイプを知りません。最後には、間違えた場合には助けません。たとえば、bフィールドを忘れてしまいました。 私はこの観点が競争できると完全に同意しますが、私はこれがocamlを書く人の考え方だと思います。

+0

ありがとうございます。私はupvoteだろうが、私の評判は低すぎる;) –

+1

うーん、私はかなり理解していない。サブタイプは、2フィールドレコードが必要な場所で3フィールドレコードを使用できることを意味します。しかし、あなたの例では、おそらく間違って2フィールドのレコードを作成します。サブタイプを指定しても、実際に2フィールド(またはそれ以下)が必要な場所でのみコンパイラを使用できます。しかし、それはうまくいきます。なぜなら、それらの場所は決してあなたの3番目のフィールドを見ないからです。 – max

関連する問題