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みても言及なさそうなのだが・・・。時々便利そうな、でも実際使いたいかは少し微妙な機能な気がする。