caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Bow-Yaw Wang <bywang@saul.cis.upenn.edu>
To: garrigue@kurims.kyoto-u.ac.jp (Jacques Garrigue)
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] copy of parametrized object
Date: Tue, 24 Jun 2003 16:33:01 -0400 (EDT)	[thread overview]
Message-ID: <200306242033.h5OKX2Xj000711@saul.cis.upenn.edu> (raw)
In-Reply-To: <20030624213608T.garrigue@kurims.kyoto-u.ac.jp> from "Jacques Garrigue" at Jun 24, 2003 09:36:08 pm


Reply in text.

> From: Bow-Yaw Wang <bywang@saul.cis.upenn.edu>
> 
> > 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 = <obj>
> > # let p = Oo.copy o;;
> > val p : < id : '_a -> '_a > = <obj>
> > # 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 > = <obj>
> 
> 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


  parent reply	other threads:[~2003-06-24 20:33 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-06-24 11:15 Bow-Yaw Wang
2003-06-24 12:36 ` Jacques Garrigue
2003-06-24 12:57   ` Stefano Zacchiroli
2003-06-24 20:33   ` Bow-Yaw Wang [this message]
2003-06-25  0:25     ` [Caml-list] Visitor pattern (was copy of parametrized object) Jacques Garrigue
2003-06-25  1:06       ` Bow-Yaw Wang
2003-06-25  2:37         ` John Max Skaller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200306242033.h5OKX2Xj000711@saul.cis.upenn.edu \
    --to=bywang@saul.cis.upenn.edu \
    --cc=caml-list@inria.fr \
    --cc=garrigue@kurims.kyoto-u.ac.jp \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).