I'm reading up on Monad tutorials, and the one I'm working on now is http://www.muitovar.com/monad/moncow.xhtml , but I ran on a problem with the state Monad, or to be more precise the runState accessor function.
The type is defined as
newtype State s a = State { runState :: (s -> (a,s)) } 
and it's called e.g.
runState (chncasewst3 'e' 'd' 'f') False
I don't know how to read the definition for getting to the second line, especially because of the "State s a" part. If it where "State a s", I could deduce that the accessor has been curried 'as far' as the 's'.
So the question is; how to read the type definition so that I could see how to call the accessor function in this situation, and if possible how to read accessor functions per se.
When you have a data type defined as
data T a b = MkT { getA :: a, getB :: b }
read it like
data T a b = MkT a b
with two helper functions defined automatically:
getA :: (T a b) -> a
getA (MkT x _) = x
getB :: (T a b) -> b
getB (MkT _ y) = y
When you apply getA to the value of T, the result is of type a.
Now your State type consists of only one element, which type is a function (:: s -> (a, s)). runState converts a value of type State s a to a function of this type.
ghci> :t runState
runState :: State s a -> s -> (a, s)
Every time you apply runState to the value of type State s a, the result is a function of type s -> (a,s). And the first argument of this function is an initial value of the state variable (of type s).
In the tutorial example,
chncasewst3 'e' 'd' 'f' has type State Bool String.runState (chncasewst3 'e' 'd' 'f') has type Bool -> (String, Bool).runState (chncasewst3 'e' 'd' 'f') False has type (String, Bool).Further reading:
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