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]))