[OCaml] 独自の演算子を定義する

OCamlでは演算子をカスタマイズできます。
そんなOCamlでの独自演算子(利用者定義演算子)の定義の方法です。

定義する

特に難しいことはありません、普通に関数を作るときとほとんど同じ書き方ができます。

文字列を繰り返す演算子(*$)を定義してみます。

let ( *$ ) str n =
  let rec iter result i =
    if i <= 0 then
      Buffer.contents result
    else
      begin
        Buffer.add_string result str;
        iter result (i-1) 
      end
    in iter (Buffer.create (String.length str * n)) n

普通に関数を作る際と異なるのは記号を()で括ることくらいです。
*(アスタリスク)を演算子に含める場合、コードコメントとの区別が曖昧になるので()*の間にスペースを入れるようにしてください。

定義した演算子は

"string multiplication" *$ 3
(* "string multiplicationstring multiplicationstring multiplication" *)

この通り普通に文字列の掛け算として使えます。

使える文字

Ocamlの独自演算子は1文字目に使う記号によって結合優先度が変わります。

独自演算子を定義する際に使える文字は以下の通りです。

The first charprefix/infix/connectivity power/left-or-right
! ~ ?prefix
= < > | & $infix0, left
@ ^infix1, right
+ -infix2, left
* /infix3, left ( ** is exceptional. It is right assoc and have power 4)

結合優先度を考えて独自の演算子を定義しないと思わぬ動作をすることがあるので注意しましょう。