Hello, I was playing around with polymorphic variant in gadt. And I get some problem with subtyping.
i.e I have type
# type int_ = [ `Int ];;
# type real = [ `Int | `Float ];;
With list, I can do
# let int_list : int_ list = [];;
# (int_list :> real list);;
- : real list = []
But I am unable to achieve the same thing with gadt.
# type _ t = | Int : int_ t | Real : real t;;
# (Int :> real t);;
Error: Type int_ t is not a subtype of real t
The first variant type does not allow tag(s) `Float
I know if I replace Int : int_ t
with something like Int : [> `Int] t
, it will work. But if want to abstract the type, OCaml does not allow me to do type int_ = [> `Int ]
. Is there a way for me to get around this? Thank you.