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 WAA00763; Tue, 24 Jun 2003 22:33:06 +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 WAA00714 for ; Tue, 24 Jun 2003 22:33:05 +0200 (MET DST) Received: from saul.cis.upenn.edu (SAUL.CIS.UPENN.EDU [158.130.12.4]) by concorde.inria.fr (8.11.1/8.11.1) with ESMTP id h5OKX3117955 for ; Tue, 24 Jun 2003 22:33:04 +0200 (MET DST) Received: from saul.cis.upenn.edu (localhost [127.0.0.1]) by saul.cis.upenn.edu (8.12.9/8.12.9) with ESMTP id h5OKX2mV000713 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Tue, 24 Jun 2003 16:33:02 -0400 (EDT) Received: (from bywang@localhost) by saul.cis.upenn.edu (8.12.9/8.12.9/Submit) id h5OKX2Xj000711; Tue, 24 Jun 2003 16:33:02 -0400 (EDT) From: Bow-Yaw Wang Message-Id: <200306242033.h5OKX2Xj000711@saul.cis.upenn.edu> Subject: Re: [Caml-list] copy of parametrized object To: garrigue@kurims.kyoto-u.ac.jp (Jacques Garrigue) Date: Tue, 24 Jun 2003 16:33:01 -0400 (EDT) Cc: caml-list@inria.fr In-Reply-To: <20030624213608T.garrigue@kurims.kyoto-u.ac.jp> from "Jacques Garrigue" at Jun 24, 2003 09:36:08 pm X-Mailer: ELM [version 2.4 PL23-upenn3.3] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam: no; 0.00; bow-yaw:01 bywang:01 caml-list:01 val:01 instantiate:01 unsound:01 monomorphic:01 visitors:99 inherit:01 imho:01 int:01 polymorphic:01 instantiated:02 objects:02 unit:03 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk Reply in text. > From: Bow-Yaw Wang > > > I'd like to know how to make independent copies of parameterized > > objects. Consider the following example: > > > > # class ['a] t = object method id (x:'a) = x end;; > > class ['a] t : object method id : 'a -> 'a end > > # let o = new t;; > > val o : '_a t = > > # let p = Oo.copy o;; > > val p : < id : '_a -> '_a > = > > # o#id 1;; > > - : int = 1 > > > > After defining a simple parameterized class t, I create an > > object o of type '_a t and make p as a copy. After the type > > '_a is instantiated to int, I'd expect p to retain its type > > < id : '_a -> '_a >. However, > > > > # p;; > > - : < id : int -> int > = > > That's just the point of non-generalized variables: if you instantiate > them somewhere, the type is propagated everywhere. So as long as the > type of o is '_a t, there is no hope. But is it necessary to propagate everywhere? If I create another t object, it is of type '_a t too. But the new object remains intact while the copied object changes its type when I instantiate the original. > > So my questions are: > > > > 1. Is there a way to make a copy of o so that it can be > > instantiated differently? > > No. Thanks for the info. It is a little disappointing, though. > > > 2. If not, is there any type-theoretic explanation? I'm > > just curious if it may make type system unsound. > > In this case, this is pretty simple: '_a is not a polymorphic > variable, this is just a monomorphic type which is not yet known. > If you copy it, you just get a pointer to the same type. '_a is not a polymorphic variable, and I didn't want it to be. I think what I want is to have a pointer to a new monomorphic type variable in copies. [snip] > I wonder what you need exactly. It is about a simplified visitor design pattern. Let's say we have: class ['value, 'visitor] a = object constraint 'visitor = < in_a : unit -> 'value; .. > method invite (v : 'visitor) = v#in_a () end;; class virtual ['value] visitor_t = object method virtual in_a : unit -> 'value end;; I can create two different visitors: class int_visitor_t = object inherit [int] visitor_t method in_a () = 0 end;; let int_v = new int_visitor_t;; class string_visitor_t = object inherit [string] visitor_t method in_a () = "a" end;; let str_v = new string_visitor_t;; Suppose I have two objects: let x = new a;; let y = Oo.copy x;; I want both int_v and str_v to be invited. I can do x#invite int_v;; But then x will be instantiated and cannot apply str_v again. So I thought a copy of x might be used in applying str_v. But it turns out the copy y will be instantiated as well. Now since the visitor type is constrained, it cannot be polymorphic in class a. A simple solution (IMHO) is to have an independent copy of x. It doesn't seem to be necessary to tie the monomorphic type variables of the copy to the original. And it would make the previous visitor pattern implementation cleaner. Otherwise, I'll have to build another x from scratch. Bow-Yaw ------------------- 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/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners