[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
where
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