From: Philippe Veber <philippe.veber@gmail.com>
To: Leo White <lpw25@cam.ac.uk>
Cc: caml users <caml-list@inria.fr>
Subject: Re: [Caml-list] Typing of a parameterized class where the type parameter is the type of self.
Date: Thu, 30 Oct 2014 17:00:19 +0100 [thread overview]
Message-ID: <CAOOOohTMm5srD1JuPUsaMvyG5z1m_mpQeZZYQRpx0bvH+DLZbA@mail.gmail.com> (raw)
In-Reply-To: <86y4rxfuus.fsf@cam.ac.uk>
[-- Attachment #1: Type: text/plain, Size: 1697 bytes --]
Thanks Leo!
This default behaviour is a bit surprising since usually, methods are not
typed as polymorphic unless stated explicitely. Here, if I wanted the
method m to be more polymorphic I could have written this:
# class type ['a] c = object ('a) method m : 'b. 'b end;;
class type ['a] c = object ('a) constraint 'a = < m : 'b. 'b; .. > method m
: 'b end
This was an easy way to say that the polymorphism of m was not captured by
'a. I don't want to abuse your time, but if you have a tiny example
illustrating when this automatic promotion is indeed useful, I'd be curious
to see it. In any case, many thanks for the fix, which I'll use right away.
cheers,
ph.
2014-10-30 16:19 GMT+01:00 Leo White <lpw25@cam.ac.uk>:
> > # class type ['a] c = object ('a) method m : 'b end;;
> > class type ['a] c = object ('a) constraint 'a = < m : 'b. 'b; .. >
> method m : 'b end
> >
> > In particular I don't understand why the method m gets a polymorphic
> > type.
>
> To allow shorter type annotations for class types, OCaml tries to
> automatically turn methods with polymorphic types into polymorphic
> methods. In this case it is being a bit over eager and making your
> method polymorphic even though it doesn't need to.
>
> You can fix this by making it more obvious that your method's
> polymorphism is contained within the class parameter 'a. You can do this
> by writing in the constraint by hand:
>
> class type ['a] c = object ('a)
> constraint 'a = < m : 'b; ..>
> method m : 'b
> end
>
> Which now allows your type definition to work:
>
> # type 'a t = (< m : int ; .. > as 'a) c;;
> type 'a t = 'a c constraint 'a = < m : int >
>
> Regards,
>
> Leo
>
[-- Attachment #2: Type: text/html, Size: 2379 bytes --]
next prev parent reply other threads:[~2014-10-30 16:00 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-30 14:51 Philippe Veber
2014-10-30 15:19 ` Leo White
2014-10-30 16:00 ` Philippe Veber [this message]
2014-10-30 16:07 ` Leo White
2014-10-30 16:13 ` Philippe Veber
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=CAOOOohTMm5srD1JuPUsaMvyG5z1m_mpQeZZYQRpx0bvH+DLZbA@mail.gmail.com \
--to=philippe.veber@gmail.com \
--cc=caml-list@inria.fr \
--cc=lpw25@cam.ac.uk \
/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