質問

私がつまずいた定義は、彼らが同じアイデアを表現することを示すようです。これが、レコードタイプ間の関係は、それらの名前ではなくフィールド(またはプロパティ)によって決まります。彼らのウィキペディアのページも同じ考えを示すようです:

A 構造型システム(またはプロパティベース型システム)は、メジャークラスです。型の互換性と等価性が型の実際の構造や定義によって決定され、その名前や宣言の場所などの他の特性によっては決定されていません。

プログラミング言語タイプ理論、 row多型は、1つを許可する一種の多型です。レコードフィールドタイプ(行とも呼ばれる、したがって行多型としても知られている)に多態性のプログラムを書き込みます。

それらの間に違いはありますか?

役に立ちましたか?

解決

構造型システムは必ずしもレコードと関係があるものではありません。たとえば、

のシステムがある可能性があります。
data Bool = False | True
data Two = Zero | One
.

は実際には同じタイプです。なぜなら、それらは2つのヌラリコンストラクタを持つタイプであるためです。それはまた必ずしもレコードについて多くを言うわけではありません。タイプはそれらの構造によって決定されていても、2つのレコードは:

{s : S ; t : T}
{s : S ; t : T ; u : U}
.

は同じ構造ではないので、これら2つのタイプに便利なものがあることなく構造的なタイピングを持つことができます。

同様に、隔離の行多型はあなたに多くを伝えません - - あなたが行を超えて定量化することができ、おそらくそれらをe.で使っています。行によってパラメータ化されたレコードタイプ。しかし、システムの機能を本当に指定する行でできることに、すべての種類のバリエーションがあります。

通常構造的に記録している人は少なくともサブタイプを望んでいます。これにより、上の2番目のレコードタイプが最初のサブタイプであると言うことができるので、後者を前者に期待しているものに渡すことができます。行多型を用いてこれを行う典型的な方法は、代わりに存在する可能性がある追加のフィールドを定量化し、ある種の行連結を使用することです。

それでは、おそらくよりターゲットの質問は、サブタイプと定量化値の違いは何ですか。その答えは一般に、定量化された変数が排他的にCovariantsまたはContavariantに発生しない限り、定量化タイプを表現できないことです。だから私たちは言うことができました:

(forall a. a -> T) ~= Top -> T
(forall a. T -> a) ~= T -> Bot
.

しかしforall a. a -> aのようなタイプの場合、情報を失うことなくaを選択するタイプはありません。

これは記録サブタイピングと(適切な)行多型を有するシステムに及ぶ。ただし、サブタイプと定量化器を持つシステムがある場合、およびサブタイピングが定量化されたタイプに適用できる場合は、違いはもっと微妙な場合があります。量子化剤とサブタイプの両方を持つことは非常に難しいことがありますが、(その列多型は正しく手に入るのが簡単ではありません)。

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top