Arantium Maestum

プログラミング、囲碁、読書の話題

TIL:OCamlのバリアントは比較できる

wamlのコードを読んでいて

let rec enforce inf (p : pred) = function
...
| Bool | Byte | Text when p <= Eq -> ()

のようなコードに行き当たった。predというのは

type pred = Any | Eq | Ord | Num

のように定義されている。つまり普通のバリアントだ。

数年OCamlを使ってきてバリアントが自動的に比較できることを初めて知った。かなりびっくりした。

type t =
  A of int
| B of string
| C of float
| D of int * string * float

で試すと:

utop # A 0 < C 0.1;;
- : bool = true

utop # A 0 < A 1;;
- : bool = true

utop # A 1 < A 1;;
- : bool = false

utop # D(0,"",0.1) < D(0,"",0.2);;
- : bool = true

utop # D(0,"a",0.1) < D(0,"",0.2);;
- : bool = false

utop # D(0,"a",0.1) < D(1,"",0.2);;
- : bool = true

まあ直感的な結果になる。lexicographicalというか。

ドキュメントReal World OCamlみても言及なさそうなのだが・・・。時々便利そうな、でも実際使いたいかは少し微妙な機能な気がする。