From mboxrd@z Thu Jan 1 00:00:00 1970 Received: by pauillac.inria.fr; Wed, 1 Feb 95 18:33:57 +0100 Received: from concorde.inria.fr by pauillac.inria.fr; Wed, 25 Jan 95 11:16:49 +0100 Received: from margaux.inria.fr (margaux.inria.fr [128.93.8.2]) by concorde.inria.fr (8.6.9/8.6.9) with ESMTP id LAA02816 for ; Wed, 25 Jan 1995 11:16:49 +0100 Received: from corton.inria.fr (corton.inria.fr [192.134.192.18]) by margaux.inria.fr (8.6.8/8.6.6) with SMTP id LAA20378 for ; Wed, 25 Jan 1995 11:17:14 +0100 Received: from lri.lri.fr by corton.inria.fr (5.65c8d/92.02.29) via Fnet-EUnet id AA02113; Wed, 25 Jan 1995 11:16:45 +0100 (MET) Received: from newsun8.lri.fr by lri.lri.fr, Wed, 25 Jan 1995 11:15:45 +0100 Received: by newsun8.lri.fr, Wed, 25 Jan 1995 11:15:45 --100 Date: Wed, 25 Jan 1995 11:15:45 --100 From: Emmanuel.Engel@lri.fr Message-Id: <9501251015.AA14578@newsun8.lri.fr> To: caml-list@margaux.inria.fr Subject: cl7 X-Sun-Charset: US-ASCII Sender: weis@pauillac.inria.fr 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