57Fermer59
SallyLe 27/01/2006 à 08:26
./56 > non il a raison... tu peux toujours déclarer plusieurs choses qui ont le même nom mais la nouvelle déclaration masque les anciennes, c'est exactement pareil que pour les identifiants. Tu n'as d'ailleurs même pas besoin de donner au type un nom différent pour que ça considère que tu as déclaré plusieurs types *différents* avec les mêmes noms de champs et que donc tu ne peux accéder qu'au dernier, regarde :
# type a = {a : int};;
type a = { a : int; }
# let x = {a = 0};;
val x : a = {a = 0}
# type a = {a : int};;
type a = { a : int; }
# x.a;;
This expression has type a but is here used with type a
trigic. Tu vois ? un record n'est pas du tout ce que tu crois, c'est quelque chose de beaucoup plus figé que ça... et donc pas question de sous-typage évidemment (le fait que tes champs a aient les mêmes noms ne fait pas qu'ils sont davantage compatibles pour ça). Bon les records ça a toujours été pourri hein... (enfin peut-être que si on maîtrise super bien le système de modules en fait c'est vachement utile dans certains cas, mais sinon c'est bel et bien pourri ^^) mais les classes ça fait exactement ce que tu veux (mais parfois il faut expliciter le sous-typage, comme je l'ai dit ; cf. fin du post)
# let f x = x#y;;
val f : < y : 'a; .. > -> 'a = <fun>

Euh sinon je crois que tu te trompes au sujet de l'héritage (enfin je comprends pas exactement ce que tu veux dire, mais sache que le mécanisme d'héritage est complètement indépendant du mécanisme de type... enfin évidemment quand tu définis une classe qui hérite d'une autre tu as des chances que les objets de cette classe se retrouvent par défaut avec un sous-type des objets de la classe parente, vu que tu ne peux pas privatiser une méthode, donc c'est quand même lié, mais je veux dire que le typeur s'en fout que tu aies déclaré la classe comme ci ou comme ça, d'ailleurs il ne sait même pas à quelle classe appartient l'objet, c'est d'ailleurs tout l'intérêt des classes...)

Pollux > j'ai retrouvé l'exemple : en fait le type des éléments d'une liste est forcément fermé, donc <m : int; ..> list ça n'existe pas, c'est obligatoirement <m : int> list, ce qui veut dire que pour mettre un élément de type <m : int; n : int> par exemple dans une telle liste tu es obligé d'utiliser ":>"