caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
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


  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;
as well as URLs for NNTP newsgroup(s).