
On Sat, 2007-10-13 at 13:35 -0400, Brandon S. Allbery KF8NH wrote:
For starters, look into "seq". Try applying it to any expression using a generated random number. This should force evaluation to occur somewhere other than when random is trying to figure out what StdGen value it's been told to use as its initial state.
Ok, but I still wonder where that might be. random and randomR are used in a function named "next" as show here: next :: (Array Int a, Array Int a, UArray Int Double) -> StdGen -> (a, StdGen) next (xs, as, rs) g = let n = length $ indices xs (x1, g1) = randomR (0, n - 1) g (x2, g2) = random g1 r = rs!x1 in if x2 <= r then (xs!x1, g2) else (as!x1, g2) x1 and x2 are used in the same function so I assume this already requires their evaluation. The only function that calls "next" is randomList: randomList :: (Array Int a, Array Int a, UArray Int Double) -> StdGen -> [a] randomList t g = let (n, g') = next t g in n:randomList t g' Cf. my original e-mail for the complete program.
Alternately you can put all the uses in IO and use Control.Exception.evaluate (or even print). This is probably not what you want to do in your actual production code, however.
Right. This is not what I want. Many thanks again, Thoralf