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)))