functor (X : S->
  sig
    type ('a, 'b) monad = 'X.monad
    val ( >>= ) : ('a, 'b) monad -> ('-> ('c, 'b) monad) -> ('c, 'b) monad
    val ( >>| ) : ('a, 'b) monad -> ('-> 'c) -> ('c, 'b) monad
    module Monad_infix :
      sig
        type ('a, 'b) monad = ('a, 'b) monad
        val ( >>= ) :
          ('a, 'b) monad -> ('-> ('c, 'b) monad) -> ('c, 'b) monad
        val ( >>| ) : ('a, 'b) monad -> ('-> 'c) -> ('c, 'b) monad
      end
    val bind : ('a, 'b) monad -> ('-> ('c, 'b) monad) -> ('c, 'b) monad
    val return : '-> ('a, 'b) monad
    val map : ('a, 'b) monad -> f:('-> 'c) -> ('c, 'b) monad
    val join : (('a, 'b) monad, 'b) monad -> ('a, 'b) monad
    val ignore : ('a, 'b) monad -> (unit, 'b) monad
  end