Lorsque le typeur Ocaml compare deux types d'objets, il compare leurs structures et pas leurs noms. Par exemple
class toto = object method getx = 3 method move x = print_string (string_of_int x) method print = print_string "toto" end;;
Les interfaces de
point et toto ont la même structure: ils
ont les mêmes noms et types de méthodes. Ils
sont considérés égaux en Ocaml. En effet, les confondre
est tout à fait naturel car ils ont la même interface
de typage: ils possèdent exactement les
mêmes méthodes avec les mêmes types, et donc on
peut effectuer avec eux les mêmes opérations. Ils sont donc
équivalents du point de vue de la sécurité du typage.
Par exemple, la fonction f est bien typée en Ocaml:
#let f (x : point) (y : toto) = if true then x else y;; val f : point -> toto -> point = <fun> #let p = new point 1;; val p : point = <obj> #let t = new toto;; val t : toto = <obj> # let z = f t p in z#print;; toto- : unit = () # let z = f p t in z#print;; 1- : unit = ()
On dira que point et toto sont deux abbreviations différentes de la même interface de classe.