Moumou :
Sally > Ben en fait je n'ai jamais fait d'OO à la caml, mais je pensais que ça marchait un peu pareil que java, non ? Ie quand on déclare une classe on déclare qu'elle hérite d'une autre, et dans ce cas toute fonction qui prend en argument la classe mère peut prendre la classe fille.
Oui voilà c'est un peu l'idée, mais malheureusement le typage a ses limitations :
# class chaine =
object(self)
method longueur = 42
end;;
class chaine : object method longueur : int end
# class caractere =
object(self)
method longueur = 1
method nom_unicode = "HOT BEVERAGE"
end;;
class caractere :
object method longueur : int method nom_unicode : string end
# let paire_vers_liste x y = [x;y];;
val paire_vers_liste : 'a -> 'a -> 'a list = <fun>
# let nimportequoi_vers_chaine c = (c:>chaine);;
val nimportequoi_vers_chaine : #chaine -> chaine = <fun>
# let caractere_vers_chaine (c:caractere) = (c:>chaine);;
val caractere_vers_chaine : caractere -> chaine = <fun>
# let fonction (x:chaine) (y:caractere) = paire_vers_liste x y;;
This expression has type caractere = < longueur : int; nom_unicode : string >
but is here used with type chaine = < longueur : int >
Only the first object type has a method nom_unicode
Bref, c'est un peu dommage que l'appel de paire_vers_liste ne soit pas capable de se rendre compte que x et y sont tous les deux des #chaine, et donc qu'on peut appeler paire_vers_liste avec 'a = chaine et les casts kivonbien

Du coup un caractère n'est pas *vraiment* une chaîne...
(menfin ils ont sûrement leurs raisons, calculabilité du typage, rétrocompatibilité, etc...)