fake-0.1: src/Fake/Types.hs
module Fake.Types where
------------------------------------------------------------------------------
import Control.Monad
import System.Random
------------------------------------------------------------------------------
newtype FGen a = MkFGen { unFGen :: StdGen -> a }
instance Functor FGen where
fmap f (MkFGen h) =
MkFGen (\r -> f (h r))
instance Applicative FGen where
pure = return
(<*>) = ap
instance Monad FGen where
return x =
MkFGen (\_ -> x)
MkFGen m >>= k =
MkFGen (\r ->
let (r1,r2) = split r
MkFGen m' = k (m r1)
in m' r2
)
------------------------------------------------------------------------------
-- | Run a generator to generate a random value in the IO monad.
generate :: FGen a -> IO a
generate (MkFGen g) = do
r <- newStdGen
return (g r)