sig
  type ('a, 'b) t
  val bind :
    ('a, 'b) Exception.t ->
    ('-> ('a, 'c) Exception.t) -> ('a, 'c) Exception.t
  val return : '-> ('b, 'a) Exception.t
  val throw : '-> ('a, 'b) Exception.t
  val catch :
    ('a, 'b) Exception.t ->
    ('-> ('c, 'b) Exception.t) -> ('c, 'b) Exception.t
  val run : ('-> 'b) -> ('-> 'b) -> ('a, 'c) Exception.t -> 'b
end