Hello. I am building a parser for a number type with integral and rational values.

```
type _ number = I : int -> int number | R : rat -> rat number
```

I have distinct functions to parse hexadecimal, binary, octal and decimal numbers. Decimal numbers can have a fractional part and are represented as rationals, all the others are ints. My parser for hexadecimal numbers has type `int number Angstrom.t`

and my parser for decimal numbers has type `rat number Angstrom.t`

.

I would like to build a parser for numbers in general, that is, something like `'a number Angstrom.t`

. But the following does not typecheck:

```
(* hex : int number Angstrom.t *)
(* decimal : rat number Angstrom.t *)
(* choice : 'a Angstrom.t list -> 'a Angstrom.t *)
choice [hex; decimal]
```

How can I do this? I have plenty of functions in my file that would have to contain additional cases in all the pattern matchings with `_ -> assert false`

if I had to switch back to regular ADTs, which would be sad. I’d like to see the GADT way.

Thanks in advance.