Version française
Home     About     Download     Resources     Contact us    
Browse thread
Re: [Caml-list] copy of parametrized object
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Bow-Yaw Wang <bywang@s...>
Subject: Re: [Caml-list] copy of parametrized object

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