
On Sat, Oct 29, 2011 at 08:48:28PM +0100, Hugo Ferreira wrote:
Hello,
I am trying to use some State Monad code in order to learn about this. However in GHCi I cannot use the "State" constructor.
import qualified Control.Monad.State
:{ | let fromStoAandS c | c `mod` 5 == 0 = ("foo",c+1) | | otherwise = ("bar",c+1) | :} :t fromStoAandS fromStoAandS :: Integral t => t -> ([Char], t)
:{ | let stateIntString = State fromStoAandS Prelude Control.Monad.State| :}
<interactive>:1:22: Not in scope: data constructor `State'
I have found a message stating that this is not possible because their is "no State data constructor", it is only "defined to be a type alias".
That is correct. State used to be defined directly; now it is just an alias for StateT s Identity. You don't really have to worry about what this means, but the point is that there is no longer a real State constructor. The author of the message then says we should use:
http://hackage.haskell.org/packages/archive/transformers/latest/doc/html/Con...
instead. Still lost however. So, how do I create the "Sate" above?
You simply replace 'State' by 'state', a function provided to act like the old State constructor. So you write let stateIntString = state fromStoAandS -Brent