Допустим, есть пример реализации частного случая монады State на Python — стека с операциями push и pop:
from collections import namedtuple
Stack = namedtuple('Stack', ('value', 'stack'))
Stack.bind = lambda self, fn: fn(self.value, self.stack)
def pop(_, stack):
return Stack(stack[-1], stack[:-1])
def push(value):
def inner(_, stack):
return Stack(value, stack + [value])
return inner
print(Stack(0, [])
.bind(push(1))
.bind(push(2))
.bind(push(3))
.bind(pop)
.stack
) # [1, 2]
Получается, что при каждой операции копируется весь стек. В Haskell можно было бы добавлять элемент в начало, тогда будет копироваться только ссылка на хвост, но суть не меняется — если бы там был словарь, то при каждой операции, получается, копируется весь словарь. По идее, производительность должна быть гораздо хуже, чем в императивных языках, где ничего копировать каждый раз не надо. Правильно ли я всё понял? Можно ли с этим что-то сделать?