Thanks all! I was trying to express the fact that heading could only be `Up or `Down but should act as a direction otherwise; Romain is right that I was expecting the coercion to happen automatically (too much time in other languages :)). Annotating 

val mutable heading : [`Up | `Down] = `Up

and then coercing it when I pass it as a direction worked nicely.

martin

On Thu, Sep 10, 2015 at 11:03 AM, Martin Jambon <martin.jambon@ens-lyon.org> wrote:
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