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