Name: Anonymous 2008-09-23 13:47
So can anybody tell me in a way one can understand it what a fucking monad does?
random :: (RandomGen g, Random a) => g -> (a, g), you'd write something like this:
nRandoms n gen
| n <= 0 = ([], gen)
| otherwise = (r:rs, gen'')
where
(r, gen') = random gen
(rs, gen'') = nRandoms (n - 1) gen'random function into a State monad:
randomS :: (RandomGen g, Random a) => State g a
randomS = State randomnRandoms like this:
nRandomsS n
| n <= 0 = return []
| otherwise = liftM2 (:) randomS (nRandomsS (n - 1))
nRandoms n gen = runState (nRandomsS n) gen
nRandoms n gen = runState (replicateM n randomS) genState monad, does is handle the state changes implicitly, so you don't have to worry about it. Here's (part of) the definition of that monad, see how simple it is:
newtype State s a = State { runState :: s -> (a, s) }
instance Monad (State s) where
return a = State $ \s -> (a, s)
m >>= k = State $ \s -> let (a, s') = runState m s
in runState (k a) s'