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 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 > >: >> >> 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 ", 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 >> >> >>