Thanks to Jake McArthur (see comment above) the solution to containing the memory usage in the case of the random number generator is to write the code as :
{-# LANGUAGE BangPatterns #-}
module Main where
import System.Random
generateNthGenerator startGen 0 = startGen
generateNthGenerator startGen n = generateNthGenerator newGen (n-1)
where randTuple = ((random startGen) :: (Bool,StdGen))
!randBool = (fst randTuple)
newGen = snd randTuple
main = do
print $ generateNthGenerator (mkStdGen 0) 10000000
Alternatively one can do as Antal S-Z suggested below :
{-# LANGUAGE BangPatterns #-}
module Main where
import System.Random
generateNthGenerator startGen 0 = startGen
generateNthGenerator startGen n = generateNthGenerator newGen (n-1)
where !(!_, newGen) = (random startGen) :: (Bool,StdGen)
main = do
print $ generateNthGenerator (mkStdGen 0) 10000000