Section 7.9.2 of the manual gives this example: http://caml.inria.fr/pub/docs/manual-ocaml-400/manual021.html#toc76 # module N : sig type t = private int val of_int: int -> t val to_int: t -> int end = struct type t = int let of_int n = assert (n >= 0); n let to_int n = n end;; module N : sig type t = private int val of_int : int -> t val to_int : t -> int end Deep coercion to a list of integers works as expected: # let l = List.map N.of_int [1;2;3];; val l : N.t list = [1; 2; 3] # (l :> int list);; - : int list = [1; 2; 3] But for arrays it doesn't work: # let a = Array.of_list l;; val a : N.t array = [|1; 2; 3|] # (a :> int array);; Error: Type N.t array is not a subtype of int array Is this because the array type does not have a variance annotation? If so, why doesn't it? I can get around this by mapping over the elements: # Array.map (fun (x : N.t) -> (x :> int)) a;; But am I right that coercions have no run-time cost, as where the mapping will?