(* 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!"