私は、OCaml 言語が持つポリモヒズムの形式を自分で理解しようとしています。
私は例によって提供されました
let id x = x
この例は C++ のテンプレート関数と同等ではありませんか
template<class A> A id(A x) { return x; }
もしそうなら、私の質問は次のとおりです: OCaml には他の形式のポリモーフィズムがありますか? この概念は、命令型言語の世界では「ポリモーフィズム」ではなく「汎用アルゴリズム」と呼ばれています。
私は、OCaml 言語が持つポリモヒズムの形式を自分で理解しようとしています。
私は例によって提供されました
let id x = x
この例は C++ のテンプレート関数と同等ではありませんか
template<class A> A id(A x) { return x; }
もしそうなら、私の質問は次のとおりです: OCaml には他の形式のポリモーフィズムがありますか? この概念は、命令型言語の世界では「ポリモーフィズム」ではなく「汎用アルゴリズム」と呼ばれています。
基本的に、ポリモーフィズムと呼ばれることもある 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。
この種のポリモーフィズムはジェネリックプログラミングと呼ばれますが、その背後にある理論的概念はパラメトリックポリモーフィズムと呼ばれます。
あなたが提供した2つの例は確かにパラメトリック多態性を示していますが、OCamlはC ++によって提供されるもの(より実用的でより多くの警告があるソリューションです)ではなく、強力な推論型チェッカーによってサポートされているため、実際の違いはC++ではコードが複製されることですOCamlでコードで使用するすべての型について、統合による暗黙の型変数の置換が存在することを確認することにより、型チェッカーによって解決されます。
OCamlでは、通常、型で注釈が付けられているものがないという理由だけで、すべてが多形になる可能性があります。したがって、実際には、関数の引数として何かを使用できる場合は、暗黙的に許可されます。
たとえば、型変数を使用してポリモーフィックメソッドを定義できます。
let swap ((x : 'a), (y : 'b)) : 'b * 'a = (y, x)
これは、タイプ'ao'bが何であれ機能するようにします。
OCamlのもう1つの強力なポリモーフィック機能は、ファンクター(一般的なC ++ファンクターではありません)ですが、他のモジュールによってパラメーター化されたモジュールです。この概念は恐ろしいように聞こえますが、実際にはOCamlコードのより高次のポリモーフィックな振る舞いを表しています。