functor (X : Parameter_input_with_arg->
  functor
    (V : sig
           type t
           val ty : t Type.t
           val name : string
           val descr : t Descr.t
           val packed_descr : Structural_descr.pack
           val reprs : t list
           val equal : t -> t -> bool
           val compare : t -> t -> int
           val hash : t -> int
           val pretty_code : Format.formatter -> t -> unit
           val internal_pretty_code :
             Type.precedence -> Format.formatter -> t -> unit
           val pretty : Format.formatter -> t -> unit
           val varname : t -> string
           val mem_project : (Project_skeleton.t -> bool) -> t -> bool
           val copy : t -> t
           val parse : string -> string * t
           val no_binding : string -> t
         end->
    sig
      type t = Datatype.String.Set.t
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val is_set : unit -> bool
      val option_name : string
      val self : State.t
      val name : string
      val kind : State.kind
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val unsafe_set : t -> unit
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val add : string -> unit
      val remove : string -> unit
      val is_empty : unit -> bool
      val get_set : ?sep:string -> unit -> string
      val iter : (string -> unit) -> unit
      val exists : (string -> bool) -> bool
      type value = V.t
      val find : string -> value
    end