sequence causing stack overflow on pretty small lists

Gabriel Gonzalez gabriel439 at gmail.com
Mon Aug 26 17:08:45 CEST 2013


The `mwc-random` package solves this specific problem by providing a 
function that creates a vector of random integers.

The `vector` package solves this in general by letting you use mutation 
to store intermediate results in order to avoid a space leak.

On 08/26/2013 01:46 AM, Niklas Hambüchen wrote:
> On #haskell we recently had a discussion about the following:
>
>     import System.Random
>
>     list <- replicateM 1000000 randomIO :: IO [Int]
>
> I would think that this gives us a list of a million random Ints. In
> fact, this is what happens in ghci. But with ghc we get:
>
>     Stack space overflow: current size 8388608 bytes.
>     Use `+RTS -Ksize -RTS' to increase it.
>
> This is because sequence is implemented as
>
>       sequence (m:ms) = do x <- m
>                            xs <- sequence ms
>                            return (x:xs)
>
> and uses stack space when used on some [IO a].
>
>  From a theoretical side, this is an implementation detail. From the
> software engineering side this disastrous because the code is
>
>    * obviously correct by itself
>    * the first thing people would come up with
>    * not exaggerating: a million elements is not much
>    * used a lot of places: mapM, replicateM are *everywhere*
>
> and yet it will kill our programs, crash our airplanes, and give no
> helpful information where the problem occurred.
>
> Effectively, sequence is a partial function.
>
> (Note: We are not trying to obtain a lazy list of random numbers, use
> any kind of streaming or the likes. We want the list in memory and use it.)
>
> We noticed that this problem did not happen if sequence were implemented
> with a difference list.
>
> What do you think about this? Should we "fix" functions like this,
> probably trading off a small performance hit, or accept that idiomatic
> Haskell code can crash at any time?
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://www.haskell.org/mailman/listinfo/libraries





More information about the Libraries mailing list