Pergunta

Uma coisa que sempre me confundiu, se é ou não é um certo tempo para usar um IORef.Existem diretrizes que devem ser seguidas no momento de decidir se quer ou não usar um IORef para uma tarefa?Quando é um bom momento para usar o Estado de mônada mais de um IORef?

Foi útil?

Solução

Estado e sua relativa ST ambos produzem `monolítico' stateful computações que podem ser executados como unidades.Eles basicamente tratar o mutável estado como intermediário de dados, o que é necessário para produzir um resultado, mas não deve, em si, ser de interesse para o resto do programa.

Por outro lado, o que se coloca dentro de uma IORef não é um `cálculo a' ser executado -- ele é apenas uma caixa segurando um valor simples que pode ser usado dentro de IO bastante maneiras arbitrárias.Esta caixa pode ser colocado dentro de estruturas de dados, passado em torno do (IO parte de) o programa, o seu conteúdo substituído sempre que a sua conveniente, ser fechado por mais de uma função, etc.Na verdade, um monte de confusão natureza das variáveis e indicadores de linguagens como C pode ser modelado com IORefs, proporcionando uma grande ajuda para qualquer especialista programador de C que desejam manter sua reputação de ser capaz de escrever código C em qualquer idioma...Isso é algo que, definitivamente, para ser usado com cuidado.

Ainda assim, é, às vezes, extremamente complicada, senão impossível, para isolar todas as interações com um pedaço de mutável estado em um único bloco de código -- algumas peças de estado deve ser simplesmente transmitido, colocado dentro de estruturas de dados, etc.Em tais casos, a caixa de abordagem pode ser a única opção.O capítulo introdução mutável estado de Escrever-se um Esquema em 48 Horas tutorial (altamente recomendado, por sinal) fornece um exemplo.(Veja o link para uma bela discussão de qual é realmente o mais adequado para uso IORefs, como oposição ao Estado ou ST, para o modelo de Regime de ambientes em uma determinada concepção de um Esquema de intérprete.)

Em suma, os ambientes precisam ser aninhados em maneiras arbitrárias, mantidos entre as instâncias de interação do usuário (um (define x 1) digitados no Regime de REPL deve, presumivelmente, resultar em que o usuário seja capaz de, mais tarde, para escrever no x e receber de volta o 1 como o valor), colocar dentro de objetos de modelagem Regime de funções (desde Esquema de funções de fechar mais os ambientes que são criados) etc.

Para resumir, eu diria que se uma tarefa não parece nada bem adequado para ele, o Estado tenderá a fornecer a solução mais pura.Se várias peças diferentes do estado de são necessária, talvez ST pode ajudar.Se, no entanto, com estado de cálculo é complicado ou impossível de bloqueio em seu próprio pedaço de código, o estado precisa para persistir em um modificável formulário para uma grande parte da vida de um complexo programa, etc., em seguida, IORefs pode ser apenas a coisa apropriada.

Então, novamente, se alguém precisa de uma espécie de estado mutável, que pode ser passado em volta e interagiram com a maneira controlada pela IO de código, por que não confira STM e a sua TVars!Eles são muito mais agradável na presença de simultaneidade, tanto assim, na verdade, como para fazer de resolução alguns a simultaneidade de tarefas relacionadas, na verdade, simples.Isto não é realmente a questão, embora, então, eu vou resistir a vontade de elaborar.:-)

Outras dicas

Hum. Você usaria um ioref quando precisar de algum estado mutável, mas está em um único ambiente de rosca. Ou quando você deseja um campo mutável dentro de uma estrutura maior que, por sua vez, é mantida por uma variável de sincronização.

Em geral, use mvars. Eles têm uma semântica mais robusta.

Pessoalmente, eu diria que é bom usar IORefs Quando e somente quando você já está usando IO. Caso contrário, sempre State, a menos que você precise do desempenho superior de ST. É possível usar vários tópicos de estado com o State Mônada, com algumas funções auxiliares - você apenas faz do estado uma tupla ou gravar e definir funções para definir, obter ou atualizar cada campo separadamente.

Em particular, geralmente não há muito sentido em usar StateT s IO. Se você já está em IO, você já tem estado mutável, então também pode usá -lo - ReaderT (IORef s) IO por exemplo.

eu uso STRef Quando o estado está localizado e não requer interação com o ambiente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top