Ответы пользователя по тегу Haskell
  • Копируется ли состояние при каждой операции над монадой состояния в Haskell?

    @nirvimel
    Несмотря на то, что 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 - довольно медленная, приведена только для примера.
    Ответ написан
    Комментировать