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.)