caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Gabriel Scherer <gabriel.scherer@gmail.com>
To: Christopher Zimmermann <madroach@gmerlin.de>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] typing mutually recursive classes
Date: Wed, 24 Oct 2012 20:40:27 +0200	[thread overview]
Message-ID: <CAPFanBFpKi_0dCfrCp5_1d9rrhx5ykhJz=WJDFAaJkzDNW0xcA@mail.gmail.com> (raw)
In-Reply-To: <20121024200310.9c639f43a97263423e113500@gmerlin.de>

I don't really understand what you are trying to achieve with this
#foo types. What would even be the type of "set" in your example? You
cannot hold a mutable reference to a polymorphic type (#element list),
so I'm not sure what you would have but (element list). If you're
going to coerce your elements into the common (element) supertype
anyway, why insist on having flexible bounds? You could just use
(registry) and (element), coerce when needed (foo :> element), and get
rid of those pesky typing issues.

On Wed, Oct 24, 2012 at 8:03 PM, Christopher Zimmermann
<madroach@gmerlin.de> wrote:
> Hi,
>
> I have a problem with typing a system of mutually recursive classes.
>
> This piece of code fails to compile:
>
> class a =
>   object end
> and b =
>   object
>     method foo: a -> int =
>       fun s -> 3
>   end;;
>
> Error: The universal type variable 'a cannot be generalized:
>        it escapes its scope.
>
>
> But this compiles fine:
>
> class a =
>   object end
> class b =
>   object
>     method foo: 'a. (#a as 'a) -> int =
>       fun s -> 3
>   end;;
>
>
> What I actually want to do is this:
>
> class element id (registry :#registry) =
>   object
>     method registry = registry
>   end
>
> and registry =
>   object
>     val set = []
>     method register :'a. (#element as 'a) -> unit =
>       fun s ->
>         set <- s :: set
>   end
>
>
> Any ideas how to do this without parametrizing the classes?
>
> Christopher
>
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs

  reply	other threads:[~2012-10-24 18:41 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-24 18:03 Christopher Zimmermann
2012-10-24 18:40 ` Gabriel Scherer [this message]
2012-10-24 19:32   ` [Caml-list] " Christopher Zimmermann
2012-10-24 20:35     ` Didier Cassirame
2012-10-24 21:30       ` Didier Cassirame
     [not found]     ` <CAPFanBHdh8xKsZC6fs2oXEOitjKLhZzVUdVmYT+6d0jL46YM0w@mail.gmail.com>
2012-10-24 21:04       ` [Caml-list] " Gabriel Scherer

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='CAPFanBFpKi_0dCfrCp5_1d9rrhx5ykhJz=WJDFAaJkzDNW0xcA@mail.gmail.com' \
    --to=gabriel.scherer@gmail.com \
    --cc=caml-list@inria.fr \
    --cc=madroach@gmerlin.de \
    /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).