Domanda

Una cosa che mi ha sempre confuso è se o non è un momento giusto per usare un IOREF. Ci sono delle linee guida che dovrebbero essere seguite al momento di decidere o meno di utilizzare un IOREF per un compito? Quando è il momento giusto per usare la monade Stato su un IOREF?

È stato utile?

Soluzione

Stato e la sua relativa ST sia produrre ` 'calcoli stateful monolitici che possono essere eseguiti come unità. In sostanza trattano stato mutevole come dati intermedi, che è necessaria per produrre un risultato, ma non dovrebbero, di per sé, essere di interesse per il resto del programma.

D'altra parte, ciò che si pone all'interno di un IOREF non è un `computazione' essere eseguito - è solo una scatola che contiene un valore semplice che può essere utilizzato entro IO in modo abbastanza arbitrario. Questa casella può essere messo all'interno strutture dati, passati intorno al (IO porzione) del programma, sono suo contenuto sostituito ogni volta che la sua comoda, essere chiuso sopra da una funzione ecc, infatti, un sacco di natura disordinata delle variabili e puntatori di linguaggi come C potrebbero essere modellati con IORefs, fornendo grande aiuto per qualsiasi programmatore esperto C che desiderano sostenere la sua / la sua reputazione di essere in grado di scrivere codice C in qualsiasi lingua ... Questa è una cosa sicuramente da usare con cura.

Ancora, è a volte molto ingombrante, se non addirittura impossibile, per isolare tutte le interazioni con un pezzo di stato mutabile in un unico blocco di codice - alcuni pezzi di Stato semplicemente devono essere passate circa, messo all'interno di strutture di dati, ecc In questi casi l'approccio casella può essere l'unica opzione. Il capitolo introducendo mutabile stato della Scrivi Yourself uno schema in 48 ore di lezioni Tutorial (altamente consigliato, tra l'altro) fornisce un esempio. (Vedi il link per una bella discussione del perché è davvero più appropriato da utilizzare IORefs, al contrario di Stato o ST, di modellare ambienti Schema in un certo progetto di un interprete Scheme).

In breve, questi ambienti devono essere annidato in modo arbitrario, mantenuti tra le istanze di interazione con l'utente (una (define x 1) digitato al Scheme REPL dovrebbe presumibilmente comporterà l'utente di essere in grado in seguito di digitare x e tornare 1 come valore ), inserire oggetti all'interno funzioni Schema di modellazione (poiché le funzioni Schema stretti nel corso degli ambienti sono creati in), ecc.

In sintesi, direi che se un compito sembra affatto adatto per esso, Stato tenderà a fornire la soluzione più pulita. Se sono necessari più pezzi separati di stato, forse ST può aiutare. Se, tuttavia, il calcolo stateful è ingombrante o impossibile da bloccare nella propria porzione di codice, lo Stato ha bisogno di persistere in una forma modificabile per gran parte della vita di un programma complesso ecc, allora IORefs può essere solo la cosa appropriata.

Poi di nuovo, se uno ha bisogno il tipo di stato mutabile che può essere passato in giro e ha interagito con in modi controllati dal codice IO, perché non controllare STM e le sue TVars! Essi sono molto più belli in presenza di concorrenza, tanto è vero, infatti, come per far risolvere alcuni le attività di concorrenza legati in realtà semplice. Questo non è in realtà legata alla domanda, però, così io resistere alla voglia di approfondire. : -)

Altri suggerimenti

Hmm. Faresti utilizzare un IOREF quando avete bisogno di qualche stato mutevole, ma sono in un unico ambiente filettato. O quando si desidera un campo mutabile all'interno di una struttura più grande che è a sua volta detenuta da una variabile di sincronizzazione.

In generale, utilizzare MVars. Hanno una semantica più robuste.

Personalmente, io direi che è bene usare IORefs quando e solo quando si sta già utilizzando IO. In caso contrario, sempre State, a meno che non è necessario le prestazioni superiori di ST. E 'possibile utilizzare più thread di Stato con la monade State, con alcune funzioni di supporto -. Basta fare lo stato di una tupla o registrare, e definire le funzioni per impostare, ottenere, o aggiornare ogni campo separatamente

In particolare, non c'è di solito molto punto nel usando StateT s IO. Se siete già in IO, hai già stato mutevole, così si potrebbe anche usarlo - ReaderT (IORef s) IO ad esempio

.

Io uso STRef quando lo stato è localizzato e non richiedono interazione con l'ambiente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top