I try to define my own type system using gadt. But it seems that is complex to mix both type system : mine and the ocaml one. This tiny example did not compile: type _ t = | Or: _ t * _ t -> _ t | Int : int t | Float : float t let a = Or (Int, Float) (*is ok*) let (||) a b = Or (a, b) let aa = Int || Float (*Error: '_a t, contains type variable that cannot be generalized*) Using an operator make a difference. But how to exprime "don't care" if a choice between 2 types is not possible to be define. It could be nice if "('a | 'b) t" worked :) Should i use normal sum type, and make all type check by a function ? Nicolas Boulay