Я слышал, что одним из преимуществ чисто функциональных структур данных является то, что вы получаете операции отмены / возврата бесплатно. Может кто-нибудь объяснить, почему? Я не понимаю, почему добавление отмены / повторения проще в функциональном языке.
Например, предположим, у меня есть следующая реализация очереди:
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 также возвращают два списка, один из которых представляет все предыдущие версии очереди, а другой список - все будущие версии очереди, и эти списки действуют как наши операции отмены / возврата , но я предполагаю, что это не то, что обычно имеют в виду люди.)