caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Martin Jambon <martin.jambon@ens-lyon.org>
To: OCaml Mailing List <caml-list@inria.fr>
Cc: Edouard Evangelisti <edouardevangelisti@gmail.com>,
	 Martin DeMello <martindemello@gmail.com>
Subject: Re: [Caml-list] using a restricted subset of a polymorphic variant
Date: Thu, 10 Sep 2015 11:03:26 -0700	[thread overview]
Message-ID: <55F1C5EE.7010205@ens-lyon.org> (raw)
In-Reply-To: <CAMCFErTTHpxpMuNg=wWLiwCUJLYJ1qK0_=8R_jgWzN2G2mvTDg@mail.gmail.com>

I'd like to add that this a good systematic way to avoid confusing error 
messages when dealing with polymorphic variants (or objects). Just add 
type annotations on variables and function parameters which are 
polymorphic variants (or objects).

Here only one extra annotation would be needed, on the heading value:

   val mutable heading : dir = `Up
   method flip_heading = ...
   method get_direction (x : dir) = ...
   method get_heading = ...

The error message becomes closer to the actual error:

File "toto.ml", line 15, characters 15-61:
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
(`West|`South|`North|`East)

Martin

On 09/10/2015 02:13 AM, Edouard Evangelisti wrote:
> Dear Martin,
>
> In your example, heading is not of type dir.
> However, this would work :
>
> val mutable heading : dir = `Up
>
> Regards,
> Edouard
>
>
> 2015-09-10 10:07 GMT+01:00 Martin DeMello <martindemello@gmail.com
> <mailto:martindemello@gmail.com>>:
>
>     I'm not sure exactly why this doesn't work:
>
>     type dir = [`North | `South | `East | `West | `Up | `Down]
>
>     let index = function
>        | `North -> 1
>        | `South -> 2
>        | `East -> 3
>        | `West -> 4
>        | `Up -> 5
>        | `Down -> 6
>
>     class foo = object(self)
>        val mutable heading = `Up
>
>        method flip_heading =
>          heading <- match heading with `Up -> `Down | `Down -> `Up
>
>        method get_direction (x : dir) = index x
>
>        method get_heading = self#get_direction heading
>     end
>
>     it fails with
>     File "test.ml <http://test.ml>", line 28, characters 42-49:
>     Error: This expression has type [ `Down | `Up ]
>             but an expression was expected of type dir
>             The first variant type does not allow tag(s)
>             `East, `North, `South, `West
>
>     but why is that an error? I'd think that any function that accepts
>     type dir should accept type [`Down | `Up] as well. Also, how do I
>     get this to work?
>
>     martin
>
>

  reply	other threads:[~2015-09-10 18:03 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-10  9:07 Martin DeMello
2015-09-10  9:12 ` Gabriel Scherer
2015-09-10  9:13 ` Edouard Evangelisti
2015-09-10 18:03   ` Martin Jambon [this message]
2015-09-10 19:14     ` Martin DeMello
2015-09-10  9:13 ` Christoph Höger
2015-09-10  9:19 ` Jacques Garrigue
2015-09-10  9:22 ` Romain

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=55F1C5EE.7010205@ens-lyon.org \
    --to=martin.jambon@ens-lyon.org \
    --cc=caml-list@inria.fr \
    --cc=edouardevangelisti@gmail.com \
    --cc=martindemello@gmail.com \
    /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).