<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>Here is some prototype code, and some comments and questions.</div><div><br></div><div>getInts and getDoubles use the State Monad approach to generate data. getInts requires putting the generator in the list comprehension. getDouble wraps it in a function.</div><div><br></div><div>getLetters just directly generates ints and converts to enums.</div><div><br></div><div>This is in an IO monad because the final code will be in the IO monad.</div><div><br></div><div>Questions:</div><div><br></div><div>- Can anyone see any value in the StateMonad in terms of ways to exploit it?</div><div>- Is there a way to get the number of constructors in Letter rather than code the number directly as (0,2)?</div><div>- What is the impact of defining the helper functions in let vs. where?</div><div><br></div><div>Mike</div><div><br></div><div><div>type GeneratorState = State StdGen</div><div><br></div><div>getRandom :: Random a => GeneratorState a</div><div>getRandom = do </div><div>              generator <- get</div><div>              let (value, newGenerator) = random generator</div><div>              put newGenerator</div><div>              return value</div></div><div><br></div><div><div><div>data Letter = A | B | C</div><div>    deriving (Eq, Enum, Show)</div><div><br></div><div>runRandomTest = do</div><div>    let ds = [(i, d, l) | i <- getInts (mkStdGen 0)  </div><div>                        | d <- getDoubles</div><div>                        | l <- getLetters ]</div><div>    print $ take 5 ds</div><div>    where</div><div>        getInts :: StdGen -> [Int]</div><div>        getInts state =</div><div>            let (val, state') = runState getRandom state in</div><div>            val:(getInts state')</div><div><br></div><div>        getDoubles :: [Double]</div><div>        getDoubles = getDoubles' (mkStdGen 0)</div><div>        getDoubles' state =</div><div>            let (val, state') = runState getRandom state in</div><div>            val:(getDoubles' state')</div><div><br></div><div>        getLetters :: [Letter]</div><div>        getLetters = map toEnum $ randomRs (0,2) (mkStdGen 0)</div></div></div><div><br></div><div><br></div><br><div><div>On Dec 15, 2014, at 8:14 AM, Erik Rantapaa <<a href="mailto:erantapaa@gmail.com">erantapaa@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr"><br><br>On Sunday, December 14, 2014 5:22:14 PM UTC-6, Michael Jones wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">The alternative might be to make a State Monad where the State is a tuple with each item holding the state for each generator. <br></blockquote><div><br></div><div>There is a common technique of using `split` and `randoms` (or `randomsR`) to create a pure list of random values which you might find helpful. Here is an example:</div><div><br></div><div><font face="courier new, monospace">{-# LANGUAGE ParallelListComp #-}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">import System.Random</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">main = do</font></div><div><font face="courier new, monospace">  g <- newStdGen</font></div><div><font face="courier new, monospace">  let (g1,g2) = split g</font></div><div><font face="courier new, monospace">      letters = randomRs ('a','z') g1</font></div><div><font face="courier new, monospace">      numbers = randomRs (15,35) g2 :: [Int]</font></div><div><font face="courier new, monospace">      pairs = [ (a,n) | (a,n) <- zip letters numbers ]</font></div><div><font face="courier new, monospace">      pairs2 = [ (a,n) | a <- letters | n <- numbers ]</font></div><div><font face="courier new, monospace">  print $ take 10 pairs</font></div><div><font face="courier new, monospace">  print $ take 10 pairs2  -- produces the same list of pairs  </font></div><div><br></div></div></blockquote></div><br></body></html>