8

OCaml がオーバーロードをサポートしていないことは知っています。では、オーバーロードする代わりに、これを回避するにはどうすればよいでしょうか?

1) 代わりにポリモーフィズムを使用しますか? 2) 異なる関数に異なる名前を付けますか? 3) 同じ名前の関数を異なるモジュールに入れますか?

どちらが機能しますか?

4

1 に答える 1

18

それはすべて、オーバーロードの意味によって異なります。次のようないくつかの使用例があります。

整数以外のものを操作する数式で通常の中置演算子名を使用する場合: 演算子をローカルに再バインドします。モジュールと「ローカル オープン」がこれに役立ちます。

module I32 = struct
  open Int32
  let (+), (-), ( * ), (/), (!!) = add, sub, mul, div, of_int
end

 ... I32.(x + y * !!2) ...

使用されている数値型の型で操作を多態的にしたい場合は、そのような数値演算子を抽象化する必要があります。たとえば、行列などで使用できる一般的な高速累乗関数 (整数による) などです。

let rec pow ( * ) one a = function
  | 0 -> one
  | n -> pow ( * ) (if n mod 2 = 0 then one else one * a) (a * a) (n / 2)

let () = assert (pow ( *.) 1. 2. 3 = 8.)

より一般的には、はい、アイデアは、一連の演算子として「オーバーロード」したいものをキャプチャすることです(ここでは演算子を挿入しますが、プレーンな名前は問題なく、読みやすくするために多くの場合優れています)、それらの操作の辞書を渡して抽象化します- - 実際、Haskell 型クラスがコンパイルされるものとよく似ています。

于 2012-05-08T13:27:26.190 に答える