有哪些具备实用价值的Undoable可撤销应用函子实例?
符合要求的实用Undoable实例是存在的,下面是两个已经在工业场景落地的典型实现:
1. 编辑器可撤销动作类型
可以定义封装状态变更的动作类型:
-- s为状态类型,a为动作返回值类型 newtype UndoAction s a = UndoAction (s -> (Maybe a, s, s -> s))
这个类型的Alternative实例逻辑为:
empty:永远返回Nothing,不修改状态的空失败动作<|>:优先执行左侧动作,如果左侧返回成功则直接返回结果,否则执行右侧动作undo的实现逻辑为:执行目标动作后,调用动作附带的回滚函数还原状态,最终返回empty,完全满足你给出的两条定律。
这个实例广泛应用于各类富文本编辑器、矢量绘图软件、CAD工具的撤销栈实现,支持任意组合多个原子操作后批量撤销,不需要额外维护历史状态快照。
2. 分布式补偿事务类型
针对微服务架构下的分布式事务场景,可以定义带补偿逻辑的IO封装类型:
newtype CompensatingIO a = CompensatingIO (IO (Maybe a, IO ()))
这个类型的Alternative实例逻辑为:
empty:直接返回Nothing,无副作用的失败动作<|>:优先执行左侧事务,成功则直接返回结果,否则执行右侧事务undo的实现逻辑为:执行目标事务后,调用事务附带的补偿IO操作回滚所有副作用,最终返回empty,完全符合定律要求。
这个实例是TCC分布式事务模式的Haskell实现版本,已经在很多金融、电商的分布式交易系统中落地,能够保证跨服务的操作序列要么全部执行成功,要么完全撤销回滚到初始状态,不会产生中间脏数据。
内容的提问来源于stack exchange,提问作者Dannyu NDos
相关产品推荐
相关产品推荐

