このページは、
多くの言語は、暗黙的サブタイプ(構造的等価)を使用せず、明示的/宣言されたサブタイプ(宣言等価)を優先します。
私は主に明示的なサブタイピングを使用するプログラミング言語を使用しました。上記のメモで説明されているように、暗黙的なサブタイピングの利点は何ですか。
このページは、
多くの言語は、暗黙的サブタイプ(構造的等価)を使用せず、明示的/宣言されたサブタイプ(宣言等価)を優先します。
私は主に明示的なサブタイピングを使用するプログラミング言語を使用しました。上記のメモで説明されているように、暗黙的なサブタイピングの利点は何ですか。
回答:
簡単な答えは、「既存のコードの追加のプロパティを検証する」です。より長い答えが続きます。
「暗黙的」と「明示的」のどちらが適切な用語かわかりません。この区別は、「構造」サブタイプと「名義」サブタイプと呼ばれることもあります。次に、構造サブタイピングの可能な解釈にも2番目の違いがあります(簡単に説明します)。サブタイピングの3つの解釈はすべて直交しているため、それぞれの使用法を理解するのではなく、相互に比較することは実際には意味がないことに注意してください。
構造サブタイプ関係A <:Bを解釈する際の主な操作上の違いは、それが(実行時/コンパイル時)計算コンテンツを伴う実際の強制によって目撃されるか、またはアイデンティティ強制によって目撃されるかどうかです。前者の場合、保持しなければならない重要な理論的特性は「一貫性」です。つまり、AがBの部分構造サブタイプであることを示す方法が複数ある場合、付随する各強制は同じ計算内容でなければなりません。
あなたが与えたリンクは、構造的サブタイピングの2番目の解釈を念頭に置いているようです。A<:Bは、アイデンティティ強制によって目撃される可能性があります。これは、サブタイプの「サブセット解釈」と呼ばれることもあり、型が値のセットを表すという単純な見方をしているので、型Aのすべての値も型Bの値である場合に備えてA <:Bです。 「精製タイピング」と呼ばれることもありますが、元の動機について読むのに適した論文は、Freeman&PfenningのML用の絞り込みタイプです。F#の最近の具体化については、Bengston et al、Refinement types for secure implementationを読むことができます。基本的な考え方は、既に型を持っている(または持たない)既存のプログラミング言語を使用しますが、その型ではそれほど多くは保証されません(たとえば、メモリの安全性のみ)。追加のより正確なプロパティ。
(今、このサブタイピングの解釈の背後にある数学的理論は、まだあるべきほどよく理解されていないと主張します。値の」タイプの解釈はあまりにもナイーブであり、従って、時にはそれが洗練されたのではなく、放棄されます。サブタイプのこの解釈はより多くの数学的な注目に値することを別の引数には、ポール・テイラーへの導入読み抽象ストーン双対性で部分空間を。)
この答えは、Noamの優れた答えに対する最小限の補足です。関心のあるデータポイントの1つは、C ++の概念の運命です。これは、型の名義的および構造的な概念を統一しようとする試みに基づいています。
ここには優れた記事があり、関連する議論の多くへのリンクがあります:http ://bartoszmilewski.wordpress.com/2010/06/24/c-concepts-a-postmortem/
ただし、上記の記事では、名目上の問題と構造的な問題については詳しく説明していません。ここには別の記事があります:http ://nerdland.net/2009/07/alas-concepts-we-hardly-knew-ye/
両方のポイントにキー紙があるビャーネ・ストロヴストルップの「概念の使用の簡素化」:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2906.pdf、実用的になりある程度の問題が発生しました。
全体として、議論は厳密ではなく実用的です。ただし、これらは、特に既存の大規模な言語のコンテキストで、これらの問題に関連するトレードオフの種類に関する優れた洞察を提供します。