[Haskell-cafe] Re: Generating a random list

Milos Hasan mhasan at cs.cornell.edu
Sat Mar 1 23:06:51 EST 2008

OK, you convinced me that sort is not the problem. After all, "last (f 
1000000)" overflows too, and last is a very innocent function.

I don't know how you found the size (or structure) of the thunks (I'm 
not aware of a ghci functionality that can tell me that), could you let 
me know?

Anyway, the problem seems to be that the values pulled from the list are 
not final float values, but instead they're thunks that grow larger and 
larger as more floats are pulled from the list. That's why last and sort 
don't work, but print and foldl' do work. Also, an odd number of 
reverses helps since sort evaluates the elements from the end of the 
list first.

So I forced those values, and it fixed the problem:

-- this function returns n random floats (no thunks)
f :: Int -> [Float]
f n = take n $ randFloats $ mkStdGen 0 where
    randFloats g = x `seq` x : randFloats g' where (x, g') = random g
main = print $ foldl1' (+) $ sort $ f 1000000

This works without overflow, and so does "last (f 1000000)".

Would it make sense for System.Random to do this forcing by default, too?


More information about the Haskell-Cafe mailing list