Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
* cl7
@ 1995-01-25 12:15 Emmanuel.Engel
  1995-02-01 17:35 ` cl7 Pierre Weis
  0 siblings, 1 reply; 2+ messages in thread
From: Emmanuel.Engel @ 1995-01-25 12:15 UTC (permalink / raw)
  To: caml-list


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






^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~1995-02-01 17:38 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1995-01-25 12:15 cl7 Emmanuel.Engel
1995-02-01 17:35 ` cl7 Pierre Weis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox