Dear Jacques: I was reading the manual of chap4, it says *tag-spec-full*::=`*tag-name * [ of *typexpr * ] { & *typexpr * } ∣ *typexpr * I don't follow the (&) operation here, it means intersection types ? I managed to make a working example: type 'a ab = [< `a|`b] as 'a ;; type 'a ac = 'a constraint 'a = [< `a | `c ] type ('a,'b) m = [< `m of 'a ab & 'a ac ] as 'b;; let u : ('a,'b) m = `m `a;; (* val u : ([ `a ], [ `m of [ `a ] ab ]) m = `m `a *) But still don't understand its use case, can you explain a bit about this? Many thanks -- Regards -- Bob