3

私は、OCaml 言語が持つポリモヒズムの形式を自分で理解しようとしています。

私は例によって提供されました

let id x = x

この例は C++ のテンプレート関数と同等ではありませんか

template<class A> A id(A x) { return x; }

もしそうなら、私の質問は次のとおりです: OCaml には他の形式のポリモーフィズムがありますか? この概念は、命令型言語の世界では「ポリモーフィズム」ではなく「汎用アルゴリズム」と呼ばれています。

4

2 に答える 2

15

基本的に、ポリモーフィズムと呼ばれることもある 3 つの言語機能があります。

  • パラメトリック ポリモーフィズム(つまり、「ジェネリック」)
  • サブタイプ ポリモーフィズム。これは、タイプのサブタイプがスーパータイプよりも具体的な操作のバージョンを提供する機能です。つまり、メソッドをオーバーライドする機能 (およびランタイム システムがメソッド ベースの正しい実装を呼び出す機能) です。オブジェクトの実行時型)。オブジェクト指向言語では、これは単に「ポリモーフィズム」と呼ばれることがよくあります。
  • いわゆるアドホック ポリモーフィズム、つまり、関数/メソッドをオーバーロードする機能。

既に発見したように、OCaml にはパラメトリック ポリモーフィズムがあります。また、サブタイプ多型もあります。アドホックなポリモーフィズムはありません。

タイトルで例を求めたので、OCaml でのサブタイプのポリモーフィズムの例を次に示します。

class c = object
    method m x = x+1
end

class d = object
    inherit c
    method m x = x+2
end

let main = 
    let o:c = new d in
    print_int (o#m 2)

これは印刷されます4

于 2013-01-21T14:42:39.780 に答える
4

この種のポリモーフィズムはジェネリックプログラミングと呼ばれますが、その背後にある理論的概念はパラメトリックポリモーフィズムと呼ばれます。

あなたが提供した2つの例は確かにパラメトリック多態性を示していますが、OCamlはC ++によって提供されるもの(より実用的でより多くの警告があるソリューションです)ではなく、強力な推論型チェッカーによってサポートされているため、実際の違いはC++ではコードが複製されることですOCamlでコードで使用するすべての型について、統合による暗黙の型変数の置換が存在することを確認することにより、型チェッカーによって解決されます。

OCamlでは、通常、型で注釈が付けられているものがないという理由だけで、すべてが多形になる可能性があります。したがって、実際には、関数の引数として何かを使用できる場合は、暗黙的に許可されます。

たとえば、型変数を使用してポリモーフィックメソッドを定義できます。

let swap ((x : 'a), (y : 'b)) : 'b * 'a = (y, x)

これは、タイプ'ao'bが何であれ機能するようにします。

OCamlのもう1つの強力なポリモーフィック機能は、ファンクター(一般的なC ++ファンクターではありません)ですが、他のモジュールによってパラメーター化されたモジュールです。この概念は恐ろしいように聞こえますが、実際にはOCamlコードのより高次のポリモーフィックな振る舞いを表しています。

于 2013-01-21T14:30:34.423 に答える