let mapi (type error) l ~(f:(int -> '-> ('b, error) t)) =
      let module M = struct
        exception E of error
        let the_fun () =
          let run () =
            List.mapi l (fun i x ->
              match f i x with
              | Ok o -> o
              | Error e -> raise (E e))
          in
          try Ok (run ())
          with
          | E e -> Error e
      end in
      M.the_fun ()