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