You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

有哪些具备实用价值的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:57:02