5

継承とパラメトリック多形( "ジェネリック")の概念、特に分散について、また、how( "構文")とどこで(use-site/declaration-site)という概念を統一することが一般的に可能かどうかは疑問です。定義する必要がありますか?継承とパラメトリック多相性の概念を統一することは可能ですか?

  • サブタイピングのE:

    は、この観点を考慮してください。 g。 S <: Tは、入力引数がTを受け入れるため、Sも受け入れるため、共変量動作として認識されます。
  • "継承モデルの分散"を不変に変更することは、サブタイプを禁止することによって定義側でのみ可能です(例えば、final修飾子をクラス定義に追加することによって)、逆分散は私が見た限り可能ではありませんほとんどの場合、
  • パラメトリック多型は、デフォルトでは不変であるが、

    • 考えると、双方の間で無視できないコンセプトのミスマッチがあるように思わコ/コントラバリアント

    行うことができます痛みの言語は「安全でない」共分散(例えば、 g。 Java/C#でString[] <: Object[])継承/パラメトリック多型が宣言され、それが

    class Foo extends Ordered[Foo] 
    
    ような、しかしうまく一緒にその作業の両方見ることができるいくつかの言語で

を継承するように比べ使用方法で

  • を使用して、順序付け/比較の動作を実装します。

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

    4

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

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

    であることを、関数型コンストラクタは、結果タイプ(データ・ソース)に対して、および引数の型(データシンク)に対する反変と共変です。これは基本的な事実であり、あなたは多かれ少なかれ矢印の方向を逆転させるような、あまりにも独創的なことをすることができません。もちろん、あなたは共変動または反共変動の代わりに無差別を使用することができます(ほとんどの言語がそうします)。

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

    私はScalaがこの点で理想的な言語にかなり近いと思います。あなたはScalaのように見える例を挙げているので、あなたはおそらくその言語に精通しています。なぜあなたはそのタイプのシステムがうまくいくつかの場合にしか機能すると思います。他の例は何ですか?

    すべての注目すべき言語デザイナーが読むべき理論的研究の1つは、Luca Cardelliの「物体の理論」です。

    +0

    書籍のおかげで、この本をまだ知りませんでした。私は基本的に、継承とppが異なるデフォルトを持つ同じ基盤概念を持ち、彼らの知覚されたユースケースに対して適合し、最適化されているのか疑問に思っています。 – soc

    +0

    「いくつかの例でうまくいく」は排他的なものではありませんでした。この2つの概念がどうやって相互にやりとりできるかを、素敵で簡単な例にしてみました。私は文言をちょっと変えました。私はScalaを好きですが、実際のコンパイラにいくつかの健全性の問題を修正したいと思いますが、それを自分で行うために必要な天才の量は不足しています。 :-) – soc