[Haskell-beginners] Request for Another State Monad Example
Daniel Fischer
daniel.is.fischer at web.de
Wed Sep 17 14:39:28 EDT 2008
Am Mittwoch, 17. September 2008 20:05 schrieb Mike Sullivan:
> Hi All,
>
> As I'm sure all Haskell beginners do, I'm having a bit of a struggle
> wrapping my head around all of the uses for monads. My current frustration
> is trying to figure out how to use the state monad to attach some
> persistent state between different calls to a function. I have two
> questions that I would appreciate it if somebody could help me with.
>
> The ubiquitous state monad example for Haskell tutorials seems to be a
> random number generator, with a function like the following (from
> http://www.haskell.org/all_about_monads/html/statemonad.html#example):
>
> getAny :: (Random a) => State StdGen a
> getAny = do g <- get
> (x,g') <- return $ random g
> put g'
> return x
>
> My first question is very basic, but here it goes: I see it everywhere, but
> what does the "=>" signify? Specifically, in this example what does
> "(Random a) =>" do in the type signature?
It describes a required context, here it means "for any type 'a' which is an
instance of the typeclass Random, getAny has the type State StdGen a".
>
> My second question is more of a request, I suppose. I think it would be
> useful to get another example that does not have the added complications of
> dealing with the Random package, and saves more than one piece of data as
> state. How would one go about (for example) creating a Fibonacci sequence
> generator that saves the last state, such that on each call it returns the
> next number in the Fibonacci sequence?
data FibState = F {previous, current :: Integer}
fibState0 = F {previous = 1, current = 0}
currentFib :: State FibState Integer
currentFib = gets current
nextFib :: State FibState Integer
nextFib = do
F p c <- get
let n = p+c
put (F c n)
return n
does that help?
>
> Thank you,
> Mike
Cheers,
Daniel
More information about the Beginners
mailing list