sig
  type ('left, 'right) t
  val bind :
    ('left, 'right) Exception.t ->
    ('right -> ('left, 'new_right) Exception.t) ->
    ('left, 'new_right) Exception.t
  val return : 'right -> ('left, 'right) Exception.t
  val throw : 'left -> ('left, 'right) Exception.t
  val catch :
    ('left, 'right) Exception.t ->
    ('left -> ('new_left, 'right) Exception.t) ->
    ('new_left, 'right) Exception.t
  val run :
    ('left -> 'a) -> ('right -> 'a) -> ('left, 'right) Exception.t -> 'a
end