2014-06-08 12 views
12

Dopo aver letto un paio di tutorial sulle monadi di stato Haskell, volevo provarli io stesso. I tutorial che ho letto sostengono che il Control.Monad.State fornire la seguente definizione:Dov'è il costruttore di dati per "Stato"?

newtype State s a = State { runState :: s -> (a,s) } 

Tuttavia, mi sembra di avere problemi trovare il costruttore di dati State:

Prelude> import Control.Monad.State 
Prelude Control.Monad.State> :t State 

<interactive>:1:1: 
    Not in scope: data constructor `State' 
    Perhaps you meant `StateT' (imported from Control.Monad.State) 

Ho anche provato un Hoogle cercare State ma non ha trovato alcun costruttore di dati con il tipo previsto.

Dove è finito il costruttore State? È mai esistito? O sto solo guardando nel posto sbagliato? In sostanza vorrei sapere cosa devo fare per creare una monade di stato.

risposta

20

Non esiste più. Sfortunatamente questo comporta molte risorse Haskell sulla web superata su di esso

Per creare un valore, si può semplicemente utilizzare la funzione state:.

state :: (s -> (a, s)) -> State s a 

runState, che era un campo di State, ora è solo una funzione normale, ma funziona allo stesso modo di prima.

State è stata riscritta in termini di trasformatore StateT monad:

type State s = StateT s Identity 

StateT sé ha un costruttore StateT che funziona in modo molto simile al vecchio State costruttore:

newtype StateT s m a = StateT { runStateT :: s -> m (a, s) } 

L'unica differenza è che esiste un parametro aggiuntivo m. Questo è solo uno slot in cui è possibile aggiungere qualsiasi altra monade, che quindi StateT si estende con le capacità di gestione dello stato. Naturalmente, per riguadagnare la vecchia funzionalità di State, è sufficiente impostare m su Identity, che non fa nulla.

newtype Identity a = Identity { runIdentity :: a } 
9

Qualche tempo fa il MTL passa da

newtype State s a = State ... 

a

type State s = StateT s Identity 

poiché altrimenti abbiamo dovuto duplicare la logica per ogni monade e il suo trasformatore. Invece è ora possibile utilizzare la funzione state

state :: (s -> (a, s)) -> State s a 

Purtroppo RWH e Lyah entrambi sono fuori data a questo proposito :(

Problemi correlati