caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Yaron Minsky <yminsky@gmail.com>
To: Jacques Garrigue <garrigue@math.nagoya-u.ac.jp>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] When is a function polymorphic?
Date: Wed, 30 Mar 2005 23:04:27 -0500	[thread overview]
Message-ID: <891bd33905033020045cad3ce2@mail.gmail.com> (raw)
In-Reply-To: <20050331.114253.48852731.garrigue@math.nagoya-u.ac.jp>

Interesting.  I guess this is best understood as a limitation of the
type-checking algorithm.  Does anyone know if there are any plans to
remove this limitation?  Are there fundamental reasons why it would be
difficult to do so?

Yaron



On Thu, 31 Mar 2005 11:42:53 +0900 (JST), Jacques Garrigue
<garrigue@math.nagoya-u.ac.jp> wrote:
> From: Yaron Minsky <yminsky@gmail.com>
> 
> > I think I screwed up the original examples a bit.  I think the effect
> > I'm looking at doesn't depend on the "as" notation in particular.
> > Here's another example that doesn't use "as":
> >
> > # function Some x -> Some () | None -> None;;
> > - : 'a option -> unit option = <fun>
> > # function Some x -> Some () | x -> x;;
> > - : unit option -> unit option = <fun>
> >
> > The reason I want this is for the following example.  Consider some
> > complicated union type with a single parameter:
> >
> > type 'a foo = A of 'a | B of int | C of string * string | ... | ZZ of float
> >
> > I want a function that converts an 'a foo to a unit foo.  I tried to
> > write it this way:
> >
> > function A _ -> A () | x -> x
> >
> > But this ends up having type: unit foo -> unit foo, which isn't what I
> > want at all.  Any idea of how to achieve this cleanly?
> 
> The effect you are looking for does depend on the "as" notation.
> Here is how to write it:
> 
> function A _ -> A () | (B _ | C _ | ... | ZZ _) as x -> x
> 
> Note that the exhaustivity checker will correctly detect that you
> second case is complete, and the pattern-matching compiler will just
> branch on wheter the tag is A or not. I.e. no code will be produced to
> check the second pattern.
> 
> As others pointed, polymorphic variants allow you to write it in a
> shorter way, because you can define a type abbreviation for the
> remaining cases, but in the end it uses the same "as" mechanism.
> 
> Jacques Garrigue
>


  reply	other threads:[~2005-03-31  4:04 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-03-30 22:31 Yaron Minsky
2005-03-31  0:37 ` [Caml-list] " Jacques Garrigue
2005-03-31  0:51   ` Yaron Minsky
2005-03-31  1:15     ` Eric Cooper
2005-03-31  1:26     ` Martin Jambon
2005-03-31  2:42     ` Jacques Garrigue
2005-03-31  4:04       ` Yaron Minsky [this message]
2005-03-31  8:32         ` Jacques Garrigue
2005-03-31 12:04           ` Yaron Minsky
2005-03-31 12:48             ` Fermin Reig
2005-03-31 12:16           ` Jon Harrop
2005-04-01 16:26           ` Luc Maranget

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=891bd33905033020045cad3ce2@mail.gmail.com \
    --to=yminsky@gmail.com \
    --cc=caml-list@inria.fr \
    --cc=garrigue@math.nagoya-u.ac.jp \
    --cc=yminsky@cs.cornell.edu \
    /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).