Несмотря на то, что State внутри тоже стек, надо разделить саму State и структуру данных, которая через него протаскивается:
from collections import namedtuple
State = namedtuple('State', ('fx', 'previous'))
State.unit = staticmethod(lambda value=None: State(lambda: value, None))
State.bind = lambda self, fx: State(fx, self)
State.get = lambda self: self.fx(self.previous.get()) if self.previous else self.fx()
push = lambda value: lambda stack: (value, stack) if stack else value
pop = lambda stack: stack[1] if isinstance(stack, tuple) else stack
toList = lambda stack: toList(stack[1]) + [stack[0]] if isinstance(stack, tuple) else [stack]
print (State.unit()
.bind(push(1))
.bind(push(2))
.bind(push(3))
.bind(pop)
.bind(toList)
.get()) # [1, 2]
toList
- довольно медленная, приведена только для примера.