Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Confusion avec le type "unit" #3367

Closed
vicuna opened this issue Jun 1, 2002 · 1 comment
Closed

Confusion avec le type "unit" #3367

vicuna opened this issue Jun 1, 2002 · 1 comment
Labels

Comments

@vicuna
Copy link

vicuna commented Jun 1, 2002

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 =()

(():unit);;

  • : unit = ()

type void = unit;;

type void = unit

();;

  • : unit = ()

(():void);;

  • : void = ()

(** c'est là que la confusion est réelle **)

type void = ();;

type void = ()

();;

  • : 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 **)

@vicuna
Copy link
Author

vicuna commented Jun 1, 2002

Comment author: administrator

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".

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.

Cordialement,

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/

@vicuna vicuna closed this as completed Jun 3, 2002
@vicuna vicuna added the bug label Mar 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant