[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ 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