[Haskell-cafe] Generating a random list
Milos Hasan
mhasan at cs.cornell.edu
Sat Mar 1 03:31:51 EST 2008
Bryan O'Sullivan wrote:
> Milos Hasan wrote:
>
>
>> so let's say I want to generate a list of N random floats. The elegant
>> way of doing it would be to create an infinite lazy list of floats and
>> take the first N, but for N = 1,000,000 or more, this overflows the
>> stack. The reason is apparently that the take function is not
>> tail-recursive, and so it uses O(N) stack space..
>>
>
> You might want to post your code. The reason take isn't tail recursive
> is that it will be evaluated lazily, so it will not consume O(n) stack
> space.
>
>
Yup, see the code I sent to Luke Palmer. The problem is that I really
need the whole list to do further processing on it, instead of just
consuming the elements one-by-one as they are produced by the random
generator. I'm trying to build a search tree, but for simplicity you
might assume that I just need to sort the list (or any other operation
that is not a simple fold).
> However, using take is the wrong approach anyway, as the user of the
> random numbers needs to return the unconsumed portion of the list so
> that the next user can consume them. This is why code that uses random
> numbers is usually written in the context of a state monad, such as
> MonadRandom: http://www.haskell.org/haskellwiki/New_monads/MonadRandom
>
That sounds interesting, but I'm not sure it's the randomness that's the
problem here. I could as well have a completely deterministic function f
:: Int -> Float, and I could try to produce the list "map f
[1..1000000]", hitting the same issue.
Cheers,
Milos
More information about the Haskell-Cafe
mailing list