(** Module à deux champs visibles. *)

module Compteur = struct
  let cur = ref 0
  let next () = incr cur ; !cur
end

(** Cachons un champ. *)

module type COMPTEUR = sig
  val next : unit -> int
end

module C : COMPTEUR = Compteur

module C2 : COMPTEUR = struct
  let cur = ref 0
  let next () = incr cur ; !cur
end

(** Pour comparer:
  * définition d'un enregistrement et accès à un de ses champs. *)

type r = { f : int }
let c = { f = 1 }
let d = c.f

(** Divers types de champs visibles. *)

module L = struct
  type t = int list
  exception Foo
  let add l = 1 :: l
  module type T = Set.OrderedType
  module M = List
end