but you can deconstruct it (it's not fully abstract)
module M : sig type t = private { a : int } val create : unit -> t end = struct type t = { a : int } let create () = { a = 5 } end
(* let a = { M.a = 5 } <-- not gonna work *)
let a = M.create ();;
(* val a : M.t = {M.a = 5} *)
let M.{ a = b } = a
(* val b : int = 5 *)