暗黙的なサブタイプと明示的なサブタイプ


18

このページは

多くの言語は、暗黙的サブタイプ(構造的等価)を使用せず、明示的/宣言されたサブタイプ(宣言等価)を優先します。

私は主に明示的なサブタイピングを使用するプログラミング言語を使用しました。上記のメモで説明されているように、暗黙的なサブタイピングの利点は何ですか。


1
この交換の範囲に関するFAQから:「この分野での作業は、数学的な手法と厳密さに重点を置いていることで区別されることがよくあります。」この質問への答えには厳密さの範囲が見当たらないので、私は反対票を投じています。
デビッドエップシュタイン

6
悲しいことに、この質問に答えるには、当初期待していたよりもはるかに厳密な範囲があります。多くの非常に著名な人々が、サブタイプに関する一見些細な質問に取り組んでいる90年代の多くを燃やしました。残念ながら、これは努力対報酬の比率が非常に低い地域です。
ニールクリシュナスワミ

6
はい、この質問に答えるには、または少なくとも暗黙的なサブタイプ何であるかを数学的に説明するには、数学と厳密さの余地がたくさんあります。努力対報酬の比率についてはわかりません。
ノアムツァイルバーガー

1
考えてみると、答えに非常に興味があることに気付いたので、「非常に難しい」と言ったはずです。
ニールクリシュナスワミ

1
わかりました、私は確信しています。私は下票を削除しますが、システムは私を許可しません。
デビッドエップシュタイン

回答:


19

簡単な答えは、「既存のコードの追加のプロパティを検証する」です。より長い答えが続きます。

「暗黙的」と「明示的」のどちらが適切な用語かわかりません。この区別は、「構造」サブタイプと「名義」サブタイプと呼ばれることもあります。次に、構造サブタイピングの可能な解釈にも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を読むことができます。基本的な考え方は、既に型を持っている(または持たない)既存のプログラミング言語を使用しますが、その型ではそれほど多くは保証されません(たとえば、メモリの安全性のみ)。追加のより正確なプロパティ。

(今、このサブタイピングの解釈の背後にある数学的理論は、まだあるべきほどよく理解されていないと主張します。値の」タイプの解釈はあまりにもナイーブであり、従って、時にはそれが洗練されたのではなく、放棄されます。サブタイプのこの解釈はより多くの数学的な注目に値することを別の引数には、ポール・テイラーへの導入読み抽象ストーン双対性で部分空間を。)


A×B×C<:A×BCAB

1
最適なメモリレイアウトを決定するのはオプティマイザの仕事です。したがって、アイデンティティである強制は実際には最適化の結果であるはずです。
アンドレイバウアー

2
私の答えに関するAndrejのコメントを明確にするために、洗練タイプの解釈では、洗練タイプには余分な計算コンテンツがないため、サブタイプ関係は定義によるアイデンティティ強制によって常に目撃されます。つまり、AとBが値Xのタイプの2つの改良版(「サブセット」/「プロパティ」)である場合、A <:BはXのすべての値xに対して、x:Aの場合x:Bもアサートします。このようなステートメントは検証または偽造できますが、実行時にx:Aおよびx:Bが存在しないという証拠があるため、実行時には効果がありません。
ノアム・ツァイルバーガー

1
N{x:N|x<232}

3
N{x:N|x<232}N{x:N|x<232}
ノアムツァイルバーガー

4

この答えは、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、実用的になりある程度の問題が発生しました。

全体として、議論は厳密ではなく実用的です。ただし、これらは、特に既存の大規模な言語のコンテキストで、これらの問題に関連するトレードオフの種類に関する優れた洞察を提供します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.