простая «отмена» в функциональных структурах данных

Я слышал, что одним из преимуществ чисто функциональных структур данных является то, что вы получаете бесплатные операции отмены / повтора. Может кто-нибудь объяснить почему? Я не Я понимаю, почему добавление отмены / повтора проще в функциональном языке.

Например, предположим, что у меня есть следующая реализация очереди:

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)

Как мне изменить это, чтобы получить операции отмены и повтора? (Я мог представить, что функции enqueue и dequeue также возвращают два списка, один из списков - все предыдущие версии очереди, а другой список - все будущие версии очереди, и эти списки действуют как наши операции отмены / повтора , но я предполагаю, что это не то, что обычно имеют в виду люди.)

11
задан Gilles 'SO- stop being evil' 5 April 2011 в 23:52
поделиться