我想编写可能失败的操作,但有一种方法可以回滚.
例如 - 预订酒店房间的外部电话,以及向信用卡收取的外部电话.这两个电话都可能失败,例如没有房间,信用卡无效.两者都有办法回滚 - 取消酒店房间,取消信用卡收费.
STM
.我觉得你可以编写一个monad Atomic T
来跟踪这些操作,如果有异常则将它们回滚.
编辑:
这些操作可以是IO
操作.如果操作只是内存操作,正如两个答案所示,STM就足够了.
例如,通过HTTP请求预订酒店.数据库操作,例如通过套接字通信插入记录.
在现实世界中,对于不可逆转的操作,在操作完成之前有一段宽限期 - 例如,信用卡付款和酒店预订可以在当天结束时结算,因此在此之前可以取消.