module Msg : sig type 'a tag = private .. type result = Result : 'a tag * 'a -> result val write : 'a tag -> 'a -> unit val read : unit -> result type 'a tag += Int : int tag module type Desc = sig type t val label : string val write : t -> string val read : string -> t end module Define : (D : Desc) -> sig type 'a tag += C : D.t tag end end val write_int : int -> unit = module StrM : sig type 'a Msg.tag += C : string Msg.tag end type 'a Msg.tag += String : string Msg.tag val write_string : string -> unit = val read_one : unit -> unit =