アヒルタイピングは動的でなければなりませんか?
-
21-09-2019 - |
質問
ウィキペディアでは*について次のように述べていました アヒルタイピング:
コンピュータ・プログラミングでは オブジェクト指向プログラミング言語、 ダックタイピングは、動的な オブジェクトの現在の メソッドとプロパティのセット が有効なセマンティクスを決定する。 を継承している。 クラスまたは特定の インターフェイスを使用している。
(*編注記:この質問が投稿されて以来、Wikipedia の記事は編集され、「動的」という言葉が削除されました)。
について書かれています 構造的型付け:
構造タイプシステム(またはプロパティベースのタイプシステム)は、タイプの互換性と等価性が、明示的な宣言ではなく、タイプの構造によって決定されるタイプシステムの主要なクラスです。
構造的サブタイピングとダックタイピングを次のように対比します。
構造システム]とは対照的です...ダックタイピングでは、実行時にアクセスされる構造の部分のみが互換性を確認します。
ただし、用語 アヒルタイピング 少なくとも私には、構造的なサブタイピング システムを直観的に包含しているように思えます。実際、ウィキペディアには次のように書かれています。
コンセプトの名前[duck-typing]。 を指す。 アヒルのテスト, による。 ジェイムズ・ウィットコム・ライリーは次のように語っている。 が続く:「歩く鳥を見ると アヒルのように泳ぎ、そして アヒルのように鳴く鳥を、私はこう呼ぶ。 ダック"
そこで私の質問は次のとおりです。なぜ構造サブタイピングをダックタイピングと呼ぶことができないのでしょうか?アヒル型として分類できない動的型付け言語も存在するのでしょうか?
追記:
誰かの名前としては 白昼夢酔った reddit.com では 雄弁に言う 「アヒルのようにコンパイルし、アヒルのようにリンクできれば...」
追記
多くの回答は、基本的に、私がすでにここで引用したことを蒸し返しているだけのようで、より深い質問には触れていません。なぜ動的型付けと構造的サブタイピングの両方をカバーするのにダックタイピングという用語を使用しないのですか?構造サブタイピングではなくダックタイピングについてのみ話したい場合は、単にそれを次のように呼んでください。 動的メンバー検索. 。私の問題は、この用語について何もないことです アヒルタイピング 私に言わせれば、これは動的言語にのみ当てはまります。
解決
C ++とDのテンプレートは、動的ではないダックタイピングの完璧な例です。これは間違いです。
でタイピング メソッドのオブジェクトの現在のセットと プロパティが有効に決定します 意味論ではなく、その継承 特定のクラスからか 特定の実装 インタフェースます。
あなたは明示的にあなたのタイプは、テンプレートをインスタンス化するから継承しなければなりませんインターフェイスを指定しないでください。それはちょうどテンプレート定義の内部で使用されているすべての機能を持っている必要があります。しかし、すべてがコンパイル時に解決し、生の、計り知れない16進数にまでコンパイルされます。私は、この「コンパイル時のダックタイピング」と呼びます。私は暗黙のテンプレートインスタンスがタイムダックタイピングをコンパイルし、そこに特徴の下で、感謝、それはほとんどの一つだと思うです。この考え方から、全体のライブラリを書いてます。
他のヒント
構造型システム
構造型のシステムは、それらが互換性があるかどうかを決定するために別の全体のタイプ1つの全体のタイプを比較します。 2種類のA
とB
は互換性があるように、A
とB
は同じ構造を有していなければならない - つまり、A
上及びB
のすべてのの方法は、同じシグネチャを有していなければならない
ダックタイピング
ダックタイピングは、彼らは両方ともそのタスクを処理できるかどう二つのタイプがのタスクのために手元にの同等であると考えています。二つのタイプのファイルに書き込みたいコードの一部に相当するとA
とB
、A
とB
両方の書き込み方法を実装する必要があります。
概要
構造型のシステムは、すべてのメソッドシグネチャ(全体構造)を比較します。ダックタイピングは、特定のタスク(タスクに関連する構造)に関連するメソッドを比較します。
アヒルタイピングとは ちょうど合っていればOKです
これは、動的に型指定された両方に適用されます。
def foo obj
obj.quak()
end
または静的に型付けされたコンパイル言語
template <typename T>
void foo(T& obj) {
obj.quak();
}
重要なのは、どちらの例でも、指定されたタイプに関する情報がまったくないということです。使用されるとき (実行時またはコンパイル時!) に型がチェックされ、すべての要件が満たされていれば、コードは機能します。価値観 明示的な型を持たない 宣言の時点で。
構造型付けは以下に依存します 明示的に入力する いつものように、あなたの値 - 違いは、具象型が継承によってではなく、その構造によって識別されるということだけです。
上記の例の構造的に型付けされたコード (Scala スタイル) は次のようになります。
def foo(obj : { def quak() : Unit }) {
obj.quak()
}
これを、OCaml のような一部の構造的に型付けされた言語では、型を明示的に定義できないようにするために、これを型推論と組み合わせているという事実と混同しないでください。
私はそれが本当にあなたの質問に答えるかどうかわからないんだけど、...
を鋳型C ++コードは、構造、非常に多くのアヒルタイピングのように見える、まだ静的であり、コンパイル時ます。
template<typename T>
struct Test
{
void op(T& t)
{
t.set(t.get() + t.alpha() - t.omega(t, t.inverse()));
}
};
これは、(Haskellのか、OCamlのだと思います)、構造タイピングが型情報を決定するために型inferencersなどで使用されていることを私の理解ですメソッド呼び出し/プロパティへのアクセスなど(RubyやJavaScriptでのチェック能力のrespond_to?
と思う)。
は常に様々な用語のいくつかの定義に違反し、いくつかのプログラミング言語からの例があるように予定されています。例えば、ActionScriptのは技術的にダイナミックでないインスタンス上のアヒルタイピングスタイルのプログラミングをやってサポートしています。
var x:Object = new SomeClass();
if ("begin" in x) {
x.begin();
}
「X」のオブジェクトインスタンスがそれを呼び出す代わりのインタフェースを使用する前に、「開始」メソッドを持っている場合は、このケースでは、テストしました。これは、ActionScriptで動作し、クラス工ass()は、それ自体が動的ではないかもしれないにもかかわらず、ほとんどダックタイピングである。
動的ダックタイピングと(すなわち、C ++で)類似の静的型付けされたコードが異なる動作をする状況があります
template <typename T>
void foo(T& obj) {
if(obj.isAlive()) {
obj.quak();
}
}
C ++では、オブジェクトは、コンパイルするためのコードisAlive
とquak
方法の両方を有していなければなりません。動的型付け言語の同等のコードのために、オブジェクトがquak
がtrueを返す場合isAlive()
メソッドを持っている必要があります。 Iは、構造(構造タイピング)および挙動(ダックタイピング)との間の差としてこれを解釈します。
(ただし、私は額面で「ダイナミックでなければならないダックタイピング」Wikipediaのを取って、それが意味をなす作るしようとすることで、この解釈に達した。暗黙の構造的なタイピングがダックタイピングであることを別の解釈もコヒーレントである。)
私は、より多くのプログラミングスタイルとして「ダックタイピング」を参照してください。
構造タイピングはの特定の構造特性を有するすべての値を含むのタイプを発現するように型システムの能力を指す。
ダックタイピングは、他の制約を課すことなく、ただ実際に手元の仕事のために必要とされる、それが渡された値の機能を使用するコードを書くことを意味します。
だから私は、の正式な構造のタイプとして私の「アヒルの種類」を宣言することで、ダックタイピングスタイルでコーディングするの構造タイプを使用することができます。しかし、私はまた、構造タイプはの「やっダックタイピング」なしでを使用することができます。例えば、私は関連する関数/メソッド/手続き/述語/クラスの束へのインターフェースを記述する場合は/何でも宣言すると、共通の構造タイプを命名して、どこでも、それはコード単位のいくつかは必要としない可能性が非常に高いということ使って、 のすべてのの構造型の特徴を、と私は不必要に彼らは理論的には正しく動作可能性があるの値を拒否するためにそれらのいくつかを制約している。
私は、共通の基盤があるかを確認することができながら、だから、私はダックタイピングが構造タイピングを包含しないと思います。彼らは事の同じ種類じゃないので、私はそれらについての考え方は、ダックタイピングは、構造的なタイピングを包摂することができたかもしれないでもものではありません。ただ、「暗黙の、未確認の構造タイプ」何かが欠けている、私見として、動的言語でダックタイピングを考えます。ダックタイピングを使用すると、プログラミング言語の技術的特徴だけでなく、を使用することを選択したかではないコーディングスタイルです。
たとえば、それは偽のOOスタイル「クラスまたはサブクラス」型制約にPythonでisinstance
チェックを使用することが可能です。これは、偽の構造型の制約のために、特定の属性とメソッドをチェックすることもできます(あなたも効果的という名前の構造型を取得し、外部関数にチェックを入れることができます!)。 (構造的なタイプは、非常にきめ細やそれらのチェックコードとの緊密な同期が保たれていない限り)私は、これらのオプションのどちらがダックタイピングを例示していることを主張するだろう。