From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id LAA23058 for caml-redistribution; Thu, 28 Aug 1997 11:37:00 +0200 (MET DST) Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id SAA10140 for ; Wed, 27 Aug 1997 18:30:37 +0200 (MET DST) Received: from nef.ens.fr (nef.ens.fr [129.199.96.12]) by nez-perce.inria.fr (8.8.7/8.8.5) with ESMTP id SAA07529 for ; Wed, 27 Aug 1997 18:30:35 +0200 (MET DST) Received: from vedette.ens.fr (vedette.ens.fr [129.199.129.18]) by nef.ens.fr (8.8.5/jtpda-5.1) with ESMTP id SAA18035 ; Wed, 27 Aug 1997 18:30:34 +0200 (MET DST) Received: from localhost (vouillon@localhost) by vedette.ens.fr (8.8.5/jb-1.1) id SAA17025 ; Wed, 27 Aug 1997 18:30:34 +0200 (MET DST) X-Authentication-Warning: vedette.ens.fr: vouillon owned process doing -bs Date: Wed, 27 Aug 1997 18:30:34 +0200 (MET DST) From: Jerome Vouillon X-Sender: vouillon@vedette Reply-To: Jerome Vouillon To: Hugo Herbelin cc: caml-list@inria.fr Subject: Re: Foncteurs polymorphes In-Reply-To: <199708251652.SAA24264@margaux.inria.fr> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=iso-8859-1 Content-Transfer-Encoding: 8BIT Sender: weis On Mon, 25 Aug 1997, Hugo Herbelin wrote: > Cela tient-il la route d'avoir une notion de polymorphisme dans les > modules qui soit distincte du polymophisme des fonctions qu'il > contient. Cela a effectivement un sens, et a d'ailleurs ete deja propose par Stefan Kahrs (http://www.dcs.ed.ac.uk/home/smk/). Cependant, pour assurer la correction du typage en presence d'effets de bords, la technique utilisee par O'caml est de ne generaliser le type que des expressions qui sont syntaxiquement des valeurs (toutes les autres techniques compliquent le systeme de type). La quantifi- cation du type des modules perd beaucoup de son interet si l'on generalise cette technique aux expressions de module. Ainsi, dans ton exemple, le module defini par module M = Make(struct let compare = Pervasives.compare end) aurait le type '_a S et non 'a S. En particulier, le type de M.empty est '_a t, qui n'est pas polymorphe. -- Jerome Vouillon > Exemple pratique : le foncteur Set.Make. > > Pourrait-on avoir les types suivants pour le module Set : > > module type 'a OrderedType = > sig > val compare: 'a -> 'a -> int > end > > module type 'a S = > sig > type 'a t > val empty: 'a t > ... > end > > module Make(Ord: 'a OrderedType) : 'a S > > où la quantification par 'a est maintenant sur Make (i.e. Make a le > type explicitement quantifié "FORALL 'a. 'a OrderedType -> 'a S")