osiire’s blog

ふしぎなそふとやさん

一級市民モジュール

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にも書いてあるけど、キーポイントは二点。

  • 「module モジュール表現 : シグネチャー」によって値が作れる
  • 「val 値 : シグネチャー」によってモジュールが作れる