sig
  type ('a, 'b) t = [ `Error of '| `Ok of 'a ]
  val return : '-> ('a, 'b) t
  val bind : ('a, 'b) t -> ('-> ('c, 'b) t) -> ('c, 'b) t
  val ( >>= ) : ('a, 'b) t -> ('-> ('c, 'b) t) -> ('c, 'b) t
  val fail : '-> ('a, 'b) t
  val map : ('a, 'b) t -> ('-> 'c) -> ('c, 'b) t
  val ( >>| ) : ('a, 'b) t -> ('-> 'c) -> ('c, 'b) t
  val destruct :
    ('a, 'b) t -> ([> `Error of '| `Ok of 'a ] -> ('c, 'd) t) -> ('c, 'd) t
  val ( >>< ) :
    ('a, 'b) t -> ([> `Error of '| `Ok of 'a ] -> ('c, 'd) t) -> ('c, 'd) t
end