From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id JAA06052; Wed, 17 Oct 2001 09:42:11 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f 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 JAA06362 for ; Wed, 17 Oct 2001 09:42:10 +0200 (MET DST) Received: from paille.inria.fr (paille.inria.fr [128.93.11.15]) by concorde.inria.fr (8.11.1/8.10.0) with ESMTP id f9H7g9118024; Wed, 17 Oct 2001 09:42:09 +0200 (MET DST) Received: by paille.inria.fr (Postfix, from userid 11683) id D42A67876; Wed, 17 Oct 2001 09:05:15 +0200 (CEST) From: Tom Hirschowitz MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15309.11691.752373.956131@paille.inria.fr> Date: Wed, 17 Oct 2001 09:05:15 +0200 To: Lauri Alanko Cc: caml-list@pauillac.inria.fr Subject: [Caml-list] Module equivalence across definitions In-Reply-To: <20011013210733.G412@la.iki.fi> References: <20011013210733.G412@la.iki.fi> X-Mailer: VM 6.92 under Emacs 20.6.1 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk Hi, I think it is more a question of datatypes than of applicative functors, in the sense that if you replace the module B with something like module B(X:T) = struct type t = int let v = 2 end then it works. It's just because sum types are some kind of abstract types, the constructors interfacing them with the outer world. For instance : # module A = struct type t = A end;; # module B = struct type t = A end;; # A.A = B.A;; This expression has type A.t but is here used with type B.t Do you agree? Lauri Alanko writes: > [Pardon for possible duplicates] > > Hello. Given: > > > module type T = sig > type t > end > > module A : T = struct > type t = A > end > > module B(X:T) = struct > type t = B > let v = B > end > > module type CT = sig > val a : B(A).t > end > > module C : CT = struct > module Aalias = A > module BA = B(Aalias) > let a = BA.v > end > > > I get an error: > > > Signature mismatch: > Modules do not match: > sig > module Aalias : sig type t = A.t end > module BA : sig type t = B(Aalias).t = B val v : t end > val a : BA.t > end > is not included in > CT > Values do not match: val a : BA.t is not included in val a : B(A).t > > > But changing "module BA = B(Aalias)" to "module BA = B(A)" makes everything > work. > > What gives? I'm used to seeing structural equivalence being used everywhere > in O'Caml's type system, but here simply renaming a module seems to give it > a distinct new identity. Is this a bug or a feature? > > > Lauri Alanko > la@iki.fi > ------------------- > Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ > To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr > ------------------- Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr