let a = `A and b = `B (1, true) and b' = `B "foo" let l1 = [ `A ; `B 1 ; `C false ];; let l2 = `A :: `D :: l1;; (* Type error when we try to add a constructor with an incompatible type *) (* let _ = `B 'b' :: l1 *) (* We decide that the type of l1 should not be instantiable anymore *) let l3 = (l1 : [ `A | `B of int | `C of bool ] list) (* Type error when we try to add a new constructor to l3 *) (* let _ = `E :: l3;; *) let f = function | `A -> `B | `C | `D -> `D;; (* Type weakening by instantiation *) let f' = (f : ([ `A | `C ] -> [`B | `D | `E ])) (* Type weakening by explicit coercion *) let f'' = (f' :> ([`A ] -> [ `B | `D | `E | `F]))