OCaml一人勉強会 - ファンクタ

(まず始めに、 OCaml のファンクタは他の言語でいう「関数オブジェクト」としてのファンクタではありません。注意。)
さて、ファンクタとはパラメータを取るモジュールのことです。多相型に似ているけれど少し違います。 C++ のテンプレートクラスに似ているかもしれません。
int 型の n という変数を持つモジュールを受け取り、引数に n 加算する関数 add を持つファンクタは以下のように書けます。

# module Add_n (N : sig val n : int end) = struct
    let add x = x + N.n;
  end;;
module Add_n :
  functor (N : sig val n : int end) -> sig val add : int -> int end
# module Add1 = Add_n (struct let n = 1 end);;
module Add1 : sig val add : int -> int end
# module Add2 = Add_n (struct let n = 2 end);;
module Add2 : sig val add : int -> int end
# Add1.add (Add2.add 3);;
- : int = 6

なんの意味もない例なうえにややこしいですね…
基本的に作るよりは使うことの多いものです。まあだから気にしない。
という事で次回は標準モジュールでファンクタを利用しているコンテナ Set と Map を触ります。