(* Sous-typage structurel sur les objets. *)
let o : < a : int > = object method a = 1 method private b = 2 end
let o :> < a : int > = object method a = 1 method b = 2 end

(* Type le plus général, inféré: < a : int ; .. > -> int. *)
let f o = 12 * o#a

(* En contraignant un peu plus. *)
let g (o : < a : int >) = 12 * o#a

let () =
  let o = object method a = 1 method b = 2 end in
    ignore (f o) ;
    (* ignore (g o) ; (* Invalide, il faut coercer. *) *)
    ignore (g (o :> < a : int >))

(* Quel est le type le plus général pour f? *)
let f o =
  if o#test then o else failwith "Argh!"