functor (M : MONAD->
  sig
    module M :
      sig
        type 'a t = 'M.t
        val return : '-> 'a t
        val ( >>= ) : 'a t -> ('-> 'b t) -> 'b t
        val ( >|= ) : 'a t -> ('-> 'b) -> 'b t
      end
    type 'a t = unit -> 'a option M.t
    val return : '-> 'a t
    val sequence_m : 'M.t GenM_intf.gen -> 'a t
    val map : ('-> 'b) -> 'a t -> 'b t
    val flat_map : ('-> 'b t) -> 'a t -> 'b t
    val fold : ('-> '-> 'a) -> '-> 'b t -> 'M.t
    val fold_m : ('-> '-> 'M.t) -> '-> 'b t -> 'M.t
    val iter : ('-> unit) -> 'a t -> unit M.t
    val iter_s : ('-> unit M.t) -> 'a t -> unit M.t
    val iter_p : ('-> unit M.t) -> 'a t -> unit M.t
    module Infix :
      sig
        val ( >>= ) : 'a t -> ('-> 'b t) -> 'b t
        val ( >|= ) : 'a t -> ('-> 'b) -> 'b t
      end
    val ( >>= ) : 'a t -> ('-> 'b t) -> 'b t
    val ( >|= ) : 'a t -> ('-> 'b) -> 'b t
  end