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 OAA28474 for caml-redistribution; Thu, 14 Nov 1996 14:15:06 +0100 (MET) Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id LAA25514 for ; Thu, 14 Nov 1996 11:20:23 +0100 (MET) Received: from margaux.inria.fr (margaux.inria.fr [128.93.8.2]) by concorde.inria.fr (8.7.6/8.7.1) with ESMTP id LAA25276 for ; Thu, 14 Nov 1996 11:20:23 +0100 (MET) Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by margaux.inria.fr (8.7.6/8.7.3) with ESMTP id LAA16125 for ; Thu, 14 Nov 1996 11:20:21 +0100 (MET) Received: from daedalus.epcc.ed.ac.uk (root@[129.215.56.21]) by concorde.inria.fr (8.7.6/8.7.1) with SMTP id LAA25272 for ; Thu, 14 Nov 1996 11:20:16 +0100 (MET) Received: from subnode.epcc.ed.ac.uk (jserot@young.epcc.ed.ac.uk [129.215.30.1]) by daedalus.epcc.ed.ac.uk (8.6.13/8.6.12) with SMTP id KAA02334 for ; Thu, 14 Nov 1996 10:20:04 GMT Message-Id: <14288.9611141020@subnode.epcc.ed.ac.uk> Subject: Re: functors and type constraints To: caml-list@margaux.inria.fr Date: Thu, 14 Nov 1996 10:20:02 +0000 (GMT) From: Jocelyn Serot X-Mailer: ELM [version 2.4 PL25] Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: weis Hello, In his last post, P. Boulet says: > hello, > > I have a problem with some complicated type constraints with Objective > Caml version 1.02. Let have an example: > > [stuff deleted] > > Everything goes find till now. Let's instanciate the modules now. > > module T1 : TAG struct ... end;; > module T2 : TAG struct ... end;; > module A1 : ARBRE Make_arbre (T1);; > module A2 : ARBRE Make_arbre (T2);; > module Trad_Tag : TRAD = > > struct = > > type from T1.t > type into T2.t > val f ... = > > end;; > > The problem appears during the compilation of the following statement: > module Trad_Arbre : TRAD Make_trad (A1) (A2) (Trad_Tag);; > Signature mismatch: > Modules do not match: > sig = > type from Trad_Tag.from = > type into Trad_Tag.into = > val f : from -> into = > end > is not included in > sig type from A1.tag type into A2.tag val f : from -> into end > Type declarations do not match: > type from Trad_Tag.from > is not included in > type from A1.tag > > These types are equal though. I imagine a problem of abstract > definition of some types, but how can I signify to the compiler that > these types are equal? I understand your problem as follows: given a function f to convert between TAGs, you want to build a function to convert between ARBREs. I recently came across a very similar problem dealing, respectively, with PIXELs and IMAGEs. Here's the solution i finally wrote, adapted a bit to fit to your definitions: ----------------------------- trad.ml ------------------------------------------ module type TAG = sig type t end;; module type ARBRE = sig type tag type quast end;; module type MAKE_ARBRE = functor (T : TAG) -> (ARBRE with type tag = T.t);; module Make_arbre : MAKE_ARBRE = functor (T : TAG) -> struct type tag = T.t type quast = {tag : tag} end;; module type TRAD = sig type t1 type t2 val f : t1 -> t2 end;; module type Make_trad = functor (A1 : ARBRE) -> functor (A2 : ARBRE) -> functor (F : sig val f : A1.tag -> A2.tag end) -> TRAD with type t1 = A1.tag and type t2 = A2.tag;; module T1 : TAG = struct type t = float end;; module T2 : TAG = struct type t = int end;; module A1 : ARBRE = Make_arbre(T1);; module A2 : ARBRE = Make_arbre(T2);; module Trad = Make_trad (A1) (A2) (struct let f = truncate end);; ----------------------------- trad.ml ------------------------------------------ Hope that helps. ------------------------------------------------------------------------------- E-mail: jserot@epcc.ed.ac.uk (->Nov 29 1996) ................................ S-mail: LASMEA - URA 1793 CNRS, Universite Blaise Pascal, 63177 Aubiere cedex Tel: (33) 73.40.73.30 - Fax: (33) 73.40.72.62 ............................... .... http://wwwlasmea.univ-bpclermont.fr/Personnel/Jocelyn.Serot/Welcome.html -------------------------------------------------------------------------------