5

継承とパラメトリックポリモーフィズム(「ジェネリック」)の概念を、特に分散に関してだけでなく、どのように(「構文」)どこで(使用サイト/宣言サイト)行う必要があるかという観点からも、一般的に統一できるのではないかと思います。定義されますか?

この観点を考慮してください:

  • たとえば、サブタイピングS <: Tは共変動作として認識できます。これは、受け入れる入力引数Tがも受け入れるためSです。
  • 「継承モデルの分散」を不変に変更することは、サブタイピングを禁止することによって定義側でのみ可能です(たとえばfinal、クラス定義に修飾子を追加する)。ほとんどの場合、逆分散は不可能です。
  • パラメトリックポリモーフィズムはデフォルトでは不変ですが、共/逆変にすることができます

考慮して、両方の間に無視できない概念の不一致があるようです

  • 「安全でない」共分散を許可することによって言語が生み出した苦痛(String[] <: Object[]Java / C#など)
  • 継承と比較して、継承/パラメトリック多型が宣言および使用される方法の違い

一部の言語では、両方がうまく連携していることがわかります。

class Foo extends Ordered[Foo]

順序付け/比較動作を実装します。

  • 継承とパラメトリックポリモーフィズムの概念を統一して、同じデフォルトの分散動作を取得できると考えられますか(たとえば、デフォルトで共分散、または代わりにほとんどのタイプを不変アノテーションでマークする必要があるため、醜さを別のポイントに移動するだけです) )?これは、データ構造もデフォルトで不変になるかのように、より実用的でしょうか?
  • これが健全であることが証明されている正式なシステムはありますか?
  • 具体的なプログラミング言語に関係なく、どの構文オプション/変更が最も必要になる可能性がありますか?
  • これ/類似のものがすでに機能しているいくつかの実用的な例または言語はありますか?
4

1 に答える 1

4

共分散/反分散とは、通常、これを意味します。XY、が型であるとしZます。さらに、が type の引数と typeの結果をa → b持つ関数型を示しているとします。サブタイプの関係、またはおそらく「適合性」の他の概念を示します。⇒矢印は「含意」と読みます。次に、次のことが成り立ちます。ab<:

X <: Y ⇒ (Z → X) <: (Z → Y)
X <: Y ⇒ (Y → Z) <: (X → Z)

つまり、関数型コンストラクターは、結果の型 (データ ソース) に関しては共変であり、引数の型 (データ シンク) に関しては反変です。これは基本的な事実であり、矢印の方向を逆にするなど、あまり創造的なことはできません。もちろん、共分散または反分散の代わりに無分散をいつでも使用できます (ほとんどの言語で使用できます)。

オブジェクト型は関数型で標準的にエンコードできるため、ここでもあまり自由がありません。すべての型パラメーターは、データ ソース (共変) またはデータ シンク (反変) のいずれか、またはその両方 (ノバリアント) を表します。ある言語で健全で反変的である場合、別の言語では反変的または不健全になります。

この点で、Scala は理想的な言語にかなり近いと思います。あなたは Scala によく似た例を挙げているので、おそらくその言語に精通しているでしょう。その型システムがうまく機能するのは、一部の場合だけだと思う​​のはなぜでしょうか。他のインスタンスは何ですか?

意欲的な言語設計者が読むべき理論書の 1 つは、Luca Cardelli による「A Theory of Objects」です。

于 2011-07-18T13:38:51.557 に答える