let bindres wr a f =
      (wr.cons a) >>=
        (fun r ->
           M.catch
             (fun () ->
                (f r) >>= (fun z -> (wr.fin r) >>= (fun () -> M.return z)))
             (fun e -> (wr.fin r) >>= (fun () -> M.error e)))