Version française
Home     About     Download     Resources     Contact us    
Browse thread
[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: Jacques Garrigue <garrigue@k...>
Subject: Re: [Caml-list] copy of parametrized object
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.

> So my questions are:
> 
> 1. Is there a way to make a copy of o so that it can be 
> instantiated differently?

No.

> 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.

As to why o has such a non-polymorphic type, this is due to the evily
famous value restriction: any function application result is
non-polymorphic, and an object construtctor is seen as a function
application.

A dangerous definition would be:

class ['a] t =
  object
    val mutable r = None
    method id (x:'a) =
      match r with Some y -> y | None -> r <- Some x; x
  end;;

> I'm aware of polymorphic methods. Unfortunately, the
> project I'm working on uses parameterized classes. Using
> polymorphic methods doesn't seem to be feasible at the
> moment. :(

I wonder what you need exactly.

Jacques

-------------------
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