sig
  type ('a, 'b) 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