I'd like to define a type with a variable that is constrained to accept only polymorphic variant types included in a given set of tags. That is how I believed one should do :
Objective Caml version 3.11.2
# type 'a t = 'a constraint 'a = [< `a | `b ];;
type 'a t = 'a constraint 'a = [< `a | `b ]
But I stumbled upon the following problem, when trying to use this definition
# module type S = sig
val v : 'a t
end;;
module type S = sig val v : [< `a | `b ] t end
# module I : S = struct
let v = `a
end;;
Error: Signature mismatch:
Modules do not match: sig val v : [> `a ] end is not included in S
Values do not match:
val v : [> `a ]
is not included in
val v : [< `a | `b ] t
Does anyone know why the definition of module I is rejected ? And if this is the intended behavior, why does the following work ?
# let v : 'a t = `a
;;
val v : [< `a | `b > `a ] t = `a
Philippe.