[Haskell-beginners] stack overflow summing numbers read from a big file

Axel Wegen axel.wegen at gmail.com
Sun Mar 24 21:04:11 CET 2013

mukesh tiwari <mukeshtiwari.iiitm at gmail.com> writes:
> It seems like the sum function is causing the stack overflow[1].
Graham Gill <math.simplex at gmail.com> writes:
> I think the problem is with laziness in the accumulator of "sum".
> The prelude "sum" is defined as

`Real World Haskell' actually has a warning regarding the use of
Prelude's foldl, the space leaks in causes and how to force evaluation
using `seq' in Chapter 4 under the headings `Left Folds, Laziness, and
Space Leaks' and `Avoiding Space Leaks with seq'. It just slipped my
mind, and I had the wrong assumption of the `sum' function.

mukesh tiwari <mukeshtiwari.iiitm at gmail.com> writes:
> import Data.List
> sum' = foldl' (+) 0

An explicit version:
sum' l = sum'' l 0
    sum'' []     a = a
    sum'' (x:xs) a = let intermediate = a + x
                     in intermediate `seq` sum'' xs intermediate

Graham Gill <math.simplex at gmail.com> writes:
> mysum xs = sum' xs 0
>   where sum' [] a = a
>         sum' (x:xs) !a = sum' xs (x + a)

All three versions work. foldl' uses `seq' to force evaluation and
therefore strictness and the `BangPatterns' are a nice syntactic feature
to express strictness, because the excessive use of `seq' can make code
unwieldy. At least that is as far as my not fully correct understanding
goes for now.

> http://www.haskell.org/haskellwiki/Memory_leak
> http://www.haskell.org/haskellwiki/Performance/Strictness
Anyway I just wanted to thank you for helping me solve my problem, for
the helpful links and slightly improving my understanding of Haskell's
laziness. Long way to go.

Axel Wegen

More information about the Beginners mailing list