Browse thread
cl7
- Emmanuel.Engel@l...
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 1995-01-25 (10:16) |
From: | Emmanuel.Engel@l... |
Subject: | cl7 |
Je ne maitrise pas bien ce qui se passe et ne suis pas sur que cela soit un bug. Soit le fichier toto.ml suivant ****************** toto.ml ******************* #open "set";; let emptyset = empty eq__compare;; let add_value x = add x emptyset;; add_value,emptyset;; (add 1 emptyset);; add_value,emptyset;; ********************************************* Les surprises commencent a la compilation camlc -c -i toto.ml value emptyset : 'a t;; value add_value : 'a -> 'a t;; (* - : ('a -> 'a t) * 'a t *) <<<<<<<<<<<< add_value,emptyset;; (* - : int t *) (* - : (int t -> int t) * int t *) <<<<<<<<<<<< add_value,emptyset;; Le type de add_value et emptyset change avec le temps !? ********************************************** Si je simplifie mon fichier et retire les trois dernieres expressions j'ai: ****************** toto1.ml ******************* #open "set";; let emptyset = empty eq__compare;; let add_value x = add x emptyset;; *********************************************** Et la j'ai un message plus explicite: camlc -c -i toto.ml value emptyset : 'a t;; value add_value : 'a -> 'a t;; The type infered for the value add_value, that is, 'a -> 'a t, contains type variables that cannot be generalized. Si j'essaye de definir un cas semblable en un seul module, je n'y arrive pas. ***************titi.ml**************************** type 'a my_list = my_cons of ('a * 'a my_list) | my_nil;; my_nil;; let empty_list = my_nil;; empty_list;; empty_list = my_cons (1,my_nil);; empty_list;; ************************************************** camlc -c -i titi.ml type 'a my_list = my_cons of 'a * 'a my_list | my_nil ;; (* - : 'a my_list *) value empty_list : 'a my_list;; (* - : 'a my_list *) <<<<<<<<<<<<<< (* - : bool *) (* - : 'a my_list *) <<<<<<<<<<<<<< Dans cet exemple, le type deduit est constant. J'ai trois questions: 1- Pourquoi ce message sur les variables de type non generalisables n'est-il pas affiche lors de la compilation de toto.ml De plus est-ce une erreur ou un warning ? 2- Pourquoi ne peut-on generaliser ces variables, il n'y a ni reference ni mutables 3- Visiblement la type de la fonction add_value n'est pas polymorphe a cause du type de emptyset qui ne l'est pas. Pourquoi le message porte-t-il sur le type de add_value et pas celui de emptyset Emmanuel Engel