type 'a t =
| Return : 'a -> 'a t
| Map : {
x : 'a t;
f : 'a -> 'b;
} -> 'b t
| Both : 'a t * 'b t -> ('a * 'b) t
| Apply : {
f : ('a -> 'b) t;
x : 'a t;
} -> 'b t
| Flag : {
names : string Nonempty_list.t;
doc : string;
} -> bool t
| Flag_count : {
names : string Nonempty_list.t;
doc : string;
} -> int t
| Named : {
names : string Nonempty_list.t;
param : 'a Param.t;
docv : string option;
doc : string;
} -> 'a t
| Named_multi : {
names : string Nonempty_list.t;
param : 'a Param.t;
docv : string option;
doc : string;
} -> 'a list t
| Named_opt : {
names : string Nonempty_list.t;
param : 'a Param.t;
docv : string option;
doc : string;
} -> 'a option t
| Named_with_default : {
names : string Nonempty_list.t;
param : 'a Param.t;
default : 'a;
docv : string option;
doc : string;
} -> 'a t
| Pos : {
pos : int;
param : 'a Param.t;
docv : string option;
doc : string;
} -> 'a t
| Pos_opt : {
pos : int;
param : 'a Param.t;
docv : string option;
doc : string;
} -> 'a option t
| Pos_with_default : {
pos : int;
param : 'a Param.t;
default : 'a;
docv : string option;
doc : string;
} -> 'a t
| Pos_all : {
param : 'a Param.t;
docv : string option;
doc : string;
} -> 'a list t