すっかり暖かくなりました。ツツジも咲き出しているので、そろそろまた駒込とかに行こうかなぁ、とか思ってます。

今回は草埋めに近い、最近知った超スモールな小ネタになります。

OCamlでまれによくあるパターン

OCamlでは、moduleの内容を隠蔽したい場合、 .mli ファイルを作る必要があります。が、そのままだと、宣言と定義でまったく同じ内容を二回書いてしまうので、よく↓のようにやります。

(* s_intf.ml *)

module type S = sig
  type t

  val hoge: t -> int
end

(* s.mli *)
include S_intf.S

(* s.ml *)

module Impl: S_intf.S = struct
  (* 実装する *)
end

include Impl

小ネタ本体:include Xxxを省略できる

上に書いたパターンのうち、 .ml 部分ですが、実はこう書けます。(記憶で書いているので、コンパイルが通るかはわかんないですが)

include struct
  type t = int

  let hoge v = v
end: S_intf.S

私も最近知ったんですが、OCamlの4.xxのどこかで、includeの直後に struct ... end を書けるようになったので、このような書き方ができるようになったらしいです。地味にボイラープレートだったので、これはこれで結構ありがたいなーという所感です。

OCamlはちょいちょい文法拡張が入ってはいるんですが、過去との互換性を崩さないように、ド派手なものは結構少なかったりするので、ふとしたときには学び直しも大事ですね。