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