À l'origine, une librairie me fournit des types variants déclarés comme suit:
type data = Int of int | Str of string;;
type oper = Var of data * Type of int | Con of data * Type of int;;

Que je matchais facilement pour mes besoins:
match var with
| Con(Int(i),_) -> process_con_int(i)
| Var(Str(s),_) -> process_var_str(s)
| _ -> ()

Le type data a ensuite evolué dans la librairie comme suit:
type data = {id: int; val: data_core;}
type data_core = Int of int | Str of string;;

Du coup je ne sais plus faire le match:
match var with
| Con(?????,_) -> process_con_int(i)
| Var(?????,_) -> process_var_str(s)
| _ -> ()

Que mettre à la place des ????? pour obtenir le même résultat qu'avant ?

J'ai bien pensé à imbriquer les matchs:
match var with
| Con(d,_)
| Var(d,_) -> (
match d.val with
| Int(i) -> process_con_int(i)
| Str(s) -> process_var_str(s))
| _ -> ()

Mais je me demandais s'il y avait moyen de faire cela avec un seul match, juste en modifiant les ????? pour obtenir la même forme de code qu' au début.