Hi Yury, Thanks for your answer! It is true your fix is accepted by the compiler, but this is not what I was looking for: in the end I'd like to have an 'a expr such that 'a is the type of the value obtained when evaluating the expression. With the polymorphic variants, I cannot write an eval function of type 'a eval -> 'a, which is the main motivation behind using GADT in that (canonical) case. Sorry for ommiting this point! ph. 2013/1/4 Yury Sulsky > Hi Philippe, > > I think you can do this by using a polymorphic variant as the type > variable: > > type _ expr = > | Int : int -> [> `int ] expr > | Float : float -> [> `float ] expr > > let parse_expr : string -> [ `int | `float ] expr = fun x -> > try Int (int_of_string x) > with _ -> > Float (float_of_string x) > ;; > > - Yury > > > > On Fri, Jan 4, 2013 at 8:32 AM, Philippe Veber wrote: > >> Dear list, >> >> Suppose I define a GADT for expressions: >> >> type _ expr = >> | Int : int -> int expr >> | Float : float -> float expr >> >> Now I want to write a parser, that will build an ['a expr] from a string. >> Without thinking much, I tried the following: >> >> let parse_expr : type s. string -> s expr = fun x -> >> try Int (int_of_string x) >> with _ -> >> Float (float_of_string x) >> ;; >> >> Which fails with the following error message: >> >> Error: This expression has type int expr but an expression was expected >> of type s expr >> >> That makes sense, since [s] is a locally abstract type. I tried a couple >> of variants and finally realised that I could not even write the type of >> [parse_expr]: it should be [string -> 'a expr] for some ['a], but I'm not >> sure that really means something. >> >> So to put it simple, how does one construct a GADT value from a string ? >> >> Cheers, >> ph. >> > >