From: Jacques Garrigue <garrigue@kurims.kyoto-u.ac.jp>
To: patrick@watson.org
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Polymorphic variant abbreviations
Date: Wed, 19 Sep 2001 21:45:24 +0900 [thread overview]
Message-ID: <20010919214524Z.garrigue@kurims.kyoto-u.ac.jp> (raw)
In-Reply-To: <Pine.BSF.3.96.1010918174443.58189A-100000@fledge.watson.org>
> I have some code that would like to use polymorphic type abbreviations
> along with labels. It seems to be not behaving quite like I expected.
> What could I do to make this shorter:
>
> type a = [ `A ]
>
> let f ~a:(#a as a) = ...
Nothing. But this doesn't strike me as a very frequent idiom.
> I was hoping that I could use this:
>
> let f ~a:#a = ...
>
> but then it says that 'a' is unbound.
Sure, nothing binds a here: ~a: is a label, and #a an abbreviation for
`A.
> I also find that the error messages are not as useful as they could be
> with the type abbreviations. E.g:
>
> This expression has type ... but is here used with #a as 'a = 'a
Could you give me the code leading to this error message?
This is clearly a bug.
> The last 2 questions were about possible minor improvements with using
> abbreviations. Now I'm stumped - can anyone bail me out?
>
> (* Some type definitions and abbreviations *)
> type t = ([ `A of 'a list | `B | `C ]) as 'a
> type b = [ `B ]
> type c = [ `C ]
>
> (* A rename for one of the abbreviations *)
> type b2 = b
>
> (*
> this doesn't compile - says unbound class b2
>
> let g2 ~(xs : #b2 list) =
> `A xs
> *)
I see. This is rather unexpected.
I'll try to correct this, but the problem is a bit involved.
> (* The first works as I would expect, the second gives a very unexpected
> type. There seems to be some kind of unexpected unification going on
> between terms. *)
>
> let h1 (#b as x1) (#c as x2) = `A [x1; x2]
> let h2 (x1 : #b) (x2 : #c) = `A [x1; x2]
(#b as x1) and (x1 : #b) have completely different meanings.
The first one is just equivalent to (`B as x1), and gives x1 the type
[> `B]. The second one constrains x1 to have type #b = [< `B].
So in h2 you unify [< `A] and [< `B], which leaves no possible
constructor...
I think that I will make it an error, because this is confusing.
Jacques Garrigue
-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
next prev parent reply other threads:[~2001-09-19 12:55 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-09-18 22:48 Patrick M Doane
2001-09-19 0:05 ` Patrick M Doane
2001-09-19 8:37 ` Laurent Vibert
2001-09-19 8:56 ` Remi VANICAT
2001-09-19 8:01 ` Laurent Vibert
2001-09-19 16:35 ` Patrick M Doane
2001-09-19 12:45 ` Jacques Garrigue [this message]
2001-09-19 16:58 ` Patrick M Doane
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=20010919214524Z.garrigue@kurims.kyoto-u.ac.jp \
--to=garrigue@kurims.kyoto-u.ac.jp \
--cc=caml-list@inria.fr \
--cc=patrick@watson.org \
/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