6

高次ポリモーフィズムは、値型を持つ型システム(.NET など) では使用/実装できないことをどこかで読んだことがあります。それは正しいですか、なぜですか?

4

2 に答える 2

7

問題は値の表現にあります。

従来の高次ポリモーフィズム言語は、すべての値を統一された方法 (通常は 1 つの単語) で表すという単純化の選択を行い、それが直接の整数であるか、共通の表現を持つ構造体へのポインターであるかを示す巧妙なタグ付け (いくつかのタグなど) データ構造や関数などの他のすべての値。

この仮定がある場合、各ポリモーフィック関数を一度コンパイルして、すべての型のすべての引数で使用できます。コンパイルされた関数によって想定される表現があります。

ここで、他の表現で型をスローするとします。スタック上のいくつかの連続した単語。単一のコンパイル済み関数をもう使用することはできません。これは、単一の単語が必要になるため、呼び出し規約が正しくないためです。何かが壊れています。

これは、次のようなさまざまな方法で修正できます。

  • 値とともに、その表現に関する情報を渡します (この情報は一種の実行時の「型」情報と考えることができますが、実際には完全な型情報は必要なく、表現に関する情報だけが必要です)。これは、たとえばTILTコンパイラが調査したものです

  • 可能な表現ごとに多態性関数のいくつかの特殊なバージョンをコンパイルしてから、どのバージョンを呼び出すかを (種類のタグまたは静的に利用可能な情報に基づいて) 決定します。これは、MLton のようなプログラム全体の最適化スキームでは妥当かもしれません。これは多かれ少なかれ、最初のアイデアの (呼び出し先選択ではなく) 呼び出し元選択バージョンです。

  • 種類システムを使用して多型を制限し、「1 語型」、「タプル型」を区別します。「すべての型に対して」通常のポリモーフィズムの代わりに、「そのような種類のすべての型に対して」相対化されたバージョンを持つことになります。これにより、プログラマーは、コンパイラーが強制を正しく取得することを期待する代わりに、どの関数がどのタイプの引数を受け入れることができるかについて静的に推論することができます (「この関数はポリモーフィックなので、ここで値の型をボックス化する必要があります」)。型システムをより重くします: 均一性の幻想を維持しません。

要するに、豊富なデータ表現の選択肢を備えた (何らかの形の) ポリモーフィズムを組み合わせることは可能ですが、均一な表現の場合よりもはるかに困難です。

于 2011-04-05T21:12:26.147 に答える
0

いいえ、これは正しくありません。パラメータタイプをジェネリックまたはタイプのいずれかとして定義することにより、「高階ポリモーフィズム」(すべてのタイプで均一に動作する関数)を実現できますobject(値タイプは自動的にオブジェクトに「ボックス化」されます)

于 2011-04-05T19:53:03.367 に答える