After reading a couple of tutorials on Haskell state monads I wanted to try them out myself. The tutorials I read claim that the Control.Monad.State provide the following definition:
newtype State s a = State { runState :: s -> (a,s) } However, I seem to be having trouble find the State data constructor:
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) I also tried a Hoogle search for State but did not find any data constructors with the expected type.
Where did the State constructor go? Did it ever exist? Or am I just looking in the wrong place? Essentially I would like to know what I need to do to create a state monad.
It doesn't exist any more. Unfortunately, this makes many Haskell resources on the web about it outdated.
To create a value, you can just use the state function:
state :: (s -> (a, s)) -> State s a runState, which used to be a field of State, is now just a normal function itself, but it works in the same way as before.
State has been rewritten in terms of the StateT monad transformer:
type State s = StateT s Identity StateT itself has a constructor StateT that functions very similarly to the old State constructor:
newtype StateT s m a = StateT { runStateT :: s -> m (a, s) } The only difference is that there is an extra parameter m. This is just a slot where you can add in any other monad, which StateT then extends with state-handling capabilities. Naturally, to regain the old functionality of State, you just have to set m to Identity, which doesn't do anything.
newtype Identity a = Identity { runIdentity :: a }
A while ago the MTL switched from
newtype State s a = State ... to
type State s = StateT s Identity since otherwise we had to duplicate the logic for every monad and its transformer. Instead you can now use the state function
state :: (s -> (a, s)) -> State s a Sadly, RWH and LYAH both are out of date in this respect :(
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With