一級市民モジュール
Changesだけぱっと見ても分かりづらいので、OCaml Version 3.12で採用予定の一級市民的モジュールの文法だけさらしておきます。
# module type Seq = sig type 'a t val of_list : 'a list -> 'a t val map : ('a -> 'b) -> 'a t -> 'b t end;; module type Seq = sig type 'a t val of_list : 'a list -> 'a t val map : ('a -> 'b) -> 'a t -> 'b t end# let lseq = (module (* モジュールを変数へ! *) struct type 'a t = 'a list let of_list x = x include List end : Seq);; val lseq : (module Seq) = <module> # [ lseq; lseq; ];; (* モジュールのリストとか作れる *) - : (module Seq) list = [<module>; <module>] # let f seqs = (* 関数にSeqモジュールのリストを渡す *) List.iter (fun seq -> let module S = (val seq : Seq) in (* 変数からモジュールを取り出す *) ignore (S.map print_int (S.of_list [1;2;3]))) seqs;; val f : (module Seq) list -> unit = <fun>
Changesにも書いてあるけど、キーポイントは二点。