Browse thread
Closed variants, type constraints and module signature
- Philippe Veber
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Philippe Veber <philippe.veber@g...> |
| Subject: | Closed variants, type constraints and module signature |
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.