functor (M : Basic) ->
  sig
    type 'a monad = 'a M.t
    val ( >>= ) : 'a monad -> ('a -> 'b monad) -> 'b monad
    val ( >>| ) : 'a monad -> ('a -> 'b) -> 'b monad
    module Monad_infix :
      sig
        type 'a monad = 'a monad
        val ( >>= ) : 'a monad -> ('a -> 'b monad) -> 'b monad
        val ( >>| ) : 'a monad -> ('a -> 'b) -> 'b monad
      end
    val bind : 'a monad -> ('a -> 'b monad) -> 'b monad
    val return : 'a -> 'a monad
    val map : 'a monad -> f:('a -> 'b) -> 'b monad
    val join : 'a monad monad -> 'a monad
    val ignore : 'a monad -> unit monad
    val unit : unit monad
  end