5

OCaml は整数と double の乗算に対して異なる操作を行うため、オブジェクト指向にするにはどうすればよいでしょうか? これは、OCaml にはポリモーフィズムがないということではないでしょうか?

4

1 に答える 1

10

はい、OCaml にはポリモーフィズムがあります。算術演算がポリモーフィック メソッドとして実装されない理由を次に示します。

  1. Integer と double は OCaml のオブジェクトではないため、メソッドを持つことはできません。
  2. OCaml の演算子はメソッドではなく関数です。もちろん、代わりにメソッドを作成するように言語を設計することもできますが、その場合、オブジェクト以外のものに対してカスタム オペレーターを定義することはできません。
  3. f (x, y) = x + y推論される型のような関数を書くと、int * int -> int. 演算子メソッドと ints オブジェクトを作成するように言語を変更した場合、推定される型は になります< + : 'a -> 'b; .. > * 'a -> 'b。このような単純な関数にこのような複雑な型を使用することは、おそらく望ましくありません。
  4. 算術演算が使用されるたびにポリモーフィック ディスパッチのコストを支払うと、パフォーマンスが低下します。

また、演算子のオーバーロードをサポートする多くの主流言語では、演算子は非仮想 (したがって非ポリモーフィック) メソッドまたは関数としても実装される傾向があることに注意してください。おそらく、上で述べたパフォーマンス上の理由からです。ポリモーフィック オペレータを持つことは、あまり一般的ではありません。

PS: 関数型言語のコンテキストでは、「ポリモーフィズム」という用語は、「パラメトリック ポリモーフィズム」(オブジェクト指向言語が「ジェネリック」と呼ぶこともある) を指すために最もよく使用されますが、オブジェクト指向言語では、「サブタイプ ポリモーフィズム」を指すために最もよく使用されます。 "。この回答は、オブジェクト指向について明示的に言及し、この文脈では前者の意味が実際には意味をなさないため、後者の意味を使用していたことを前提としています。

于 2013-01-20T12:50:59.540 に答える