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