caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Jacques Garrigue <garrigue@kurims.kyoto-u.ac.jp>
To: bywang@saul.cis.upenn.edu
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] copy of parametrized object
Date: Tue, 24 Jun 2003 21:36:08 +0900	[thread overview]
Message-ID: <20030624213608T.garrigue@kurims.kyoto-u.ac.jp> (raw)
In-Reply-To: <200306241115.h5OBFH5U025183@saul.cis.upenn.edu>

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


  reply	other threads:[~2003-06-24 12:36 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 [this message]
2003-06-24 12:57   ` Stefano Zacchiroli
2003-06-24 20:33   ` Bow-Yaw Wang
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=20030624213608T.garrigue@kurims.kyoto-u.ac.jp \
    --to=garrigue@kurims.kyoto-u.ac.jp \
    --cc=bywang@saul.cis.upenn.edu \
    --cc=caml-list@inria.fr \
    /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).