数据结构 – 在功能数据结构中容易“撤消”

我听说纯功能数据结构的好处之一是你可以免费获得撤消/重做操作.有人可以解释为什么吗我不明白为什么在功能语言中添加撤消/重做更容易.

例如,假设我有一个队列的以下实现:

data Queue a = Queue [a] [a]

newQueue :: Queue a
newQueue = Queue [] []

empty :: Queue a -> Bool
empty (Queue [] []) = True
empty _ = False

enqueue :: Queue a -> a -> Queue a
enqueue (Queue xs ys) y = Queue xs (y:ys)

dequeue :: Queue a -> (a, Queue a)
dequeue (Queue [] []) = error "Queue is empty!"
dequeue (Queue [] ys) = dequeue (Queue (reverse ys) [])
dequeue (Queue (x:xs) ys) = (x, Queue xs ys)

我如何修改这个来取消和重做操作? (我可以想象,入队和出队功能也返回两个列表,其中一个列表是队列的所有先前版本,另一个列表是队列的所有未来版本,这些列表作为我们的撤消/重做操作,但我猜这不是人们通常所想到的.)

最佳答案
例:

q1 = newQueue
q2 = enque q1 3

那么q1是q2的撤消,因为所有值都是不可变的.只要保留对先前值的引用.

转载注明原文:数据结构 – 在功能数据结构中容易“撤消” - 代码日志