Одно из решений состоит в том, чтобы сделать тип абстрактным, то есть интерфейс модуля должен отображать только это:
(* abstract *)
type 'a t
вместо
(* concrete *)
type 'a t = shape * colour
Промежуточное решение, которое работает с последними версии OCaml должны объявлять тип как закрытый:
type 'a t = private (shape * colour)
Обычно это полезно для раскрытия структуры типа в целях сопоставления с образцом, в то же время вынуждая пользователя создавать правильно сформированные объекты, вызывая Функции модуля.
Более простой пример использования private
- для создания уникального идентификатора:
module ID : sig
type t = private int
val create : unit -> t
end = struct
type t = int (* note: no 'private' *)
let counter = ref 0
let create () =
let res = !counter in
if res < 0 then
failwith "ID.create: int overflow";
incr counter;
res
end