You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Original bug ID: 1178 Reporter: administrator Status: closed Resolution: not a bug Priority: normal Severity: minor Category: ~DO NOT USE (was: OCaml general)
Je pense qu'il y a une confusion entre "()" la valeur du type "unit"
et le type "()" qui, je pense, doit étre un "zéro-uple".
Par définition, () est la seule valeur du type prédéfini unit. En
outre, () est une valeur non un type (plus exactement c'est un
constructeur). Il n'y a donc pas de type "()" et aucun moyen dans le
langage d'un définir un.
(** Ici tout va bien **)
();;
: unit =()
(():unit);;
: unit = ()
type void = unit;;
type void = unit
();;
: unit = ()
(():void);;
: void = ()
Vous avez raison, il n'y a là rien que de très normal.
(** c'est là que la confusion est réelle **)
type void = ();;
type void = ()
Ici vous avez défini un nouveau type appelé void, qui comporte un seul
et unique constructeur, à savoir ().
();;
: void = ()
C'est bien ce que nous observons: () est maintenant le seul
constructeur du (nouveau) type void.
(():unit);;
This expression has type void but is here used with type unit
Ce qui confirme la théorie!
(** Ouups, le type "unit" n'a plus de représentant possible **)
C'est faux le type unit possède toujours son élément unique, mais vous
ne pouvez plus y faire référence avec () que vous avez redéfini. Si
vous aviez défini un nom the_unit par () avant de redéfinir () vous
auriez toujours accès à l'aide de the_unit à l'unique valeur du type
unit.
(** Je pense qu'il faudrait interdire "()" comme étant un type **)
C'est déjà fait: on ne peut pas définir un type qui s'appelle ().
type () = int;;
^
Syntax error
En revanche, on pourrait peut-être interdire la redéfinition du
constructeur (), et c'est sans doute ce que vous voulez dire. On le
pourrait certainement, mais à quoi bon ? Ce serait introduire un cas
particulier inutile dans le langage qui vous permet actuellement de
tout (ou pratiquement tout) redéfinir: vous pouvez ainsi redéfinir +
et ne plus pouvoir ensuite faire l'addition de deux entiers! C'est le
même phénomène que celui que vous observez avec (); lorsque vous
redéfinissez un identificateur vous perdez l'accès à son ancienne
définition, si vous n'avez pris préalablement la précaution de lui
donner aussi un autre nom.
Original bug ID: 1178
Reporter: administrator
Status: closed
Resolution: not a bug
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)
Bug description
Full_Name: Laurent MAGDELAINE
Version: 3.04
OS: RedHat 6.2
Submission from: ca-ol-bordeaux-34-186.abo.wanadoo.fr (80.8.82.186)
Je pense qu'il y a une confusion entre "()" la valeur du type "unit"
et le type "()" qui, je pense, doit étre un "zéro-uple".
(** Ici tout va bien **)
();;
(():unit);;
type void = unit;;
type void = unit
();;
(():void);;
(** c'est là que la confusion est réelle **)
type void = ();;
type void = ()
();;
(():unit);;
This expression has type void but is here used with type unit
(** Ouups, le type "unit" n'a plus de représentant possible **)
(** Je pense qu'il faudrait interdire "()" comme étant un type **)
The text was updated successfully, but these errors were encountered: