A mona da pausa

As mônadas podem fazer muitas coisas incríveis e loucas. Eles podem criar variáveis ​​que contêm uma superposição de valores. Eles podem permitir que você acesse dados do futuro antes de calculá-los. Eles podem permitir que você escreva atualizações destrutivas, mas não realmente. E então a continuação da mônada permite que vocêquebrar a mente das pessoas! Usualmente seu. ;-)

Mas aqui está um desafio: você pode fazer uma mônada que pode serpausado?

data Pause s x
instance Monad (Pause s)
mutate :: (s -> s) -> Pause s ()
yield :: Pause s ()
step :: s -> Pause s () -> (s, Maybe (Pause s ()))

oPause mônada é uma espécie de mônada do estadomutate, com a semântica óbvia). Normalmente, uma mônada como essa tem algum tipo de função de "execução", que executa a computação e retorna o estado final. MasPause é diferente: fornece umastep função, que executa o cálculo até que ele chama o mágicoyield função. Aqui o cálculo é pausado, retornando ao chamador informações suficientes para retomar a computação mais tarde.

Para awesomness extra: Permitir que o chamador modifique o estado entrestep chamadas. (As assinaturas de tipo acima deveriam permitir isso, por exemplo).

Caso de uso: geralmente é fácil escrever código que faz algo complexo, mas um PITA total para transformá-lo em algosaída os estados intermediários em sua operação. Se você quiser que o usuário possamudança algo a meio da execução, as coisas ficam complexas muito rápido.

Idéias de implementação:

Obviamente isso pode ser feito com threads, bloqueios eIO. Mas podemos fazer melhor? ;-)

Algo louco com uma mônada de continuação?

Talvez algum tipo de escritor, ondeyield apenas registra o estado atual, e então podemos "fingir"step iterando sobre os estados no log. (Obviamente, isso impede a alteração do estado entre as etapas, já que não estamos realmente "pausando" nada agora.)

questionAnswers(6)

yourAnswerToTheQuestion