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