[Haskell-cafe] Looking for suggestions to improve my algorithm
Daniel Fischer
daniel.is.fischer at web.de
Wed Aug 29 19:29:10 EDT 2007
Am Donnerstag, 30. August 2007 01:08 schrieb Brent Yorgey:
> Hi David,
>
> Project Euler is a good way to learn some Haskell, although it does tend to
> give you a crash course in understanding laziness, efficiency and such in
> Haskell (whether that's good or bad depends on your point of view!).
>
> All you need to do to stop your program from overflowing the stack is to
> change foldl to foldl' in the definition of main (foldl' is in Data.List so
> you'll also have to import that).
I didn't even need to do that. Worked fine for me as it is (I compiled with
-O2, that probably helped).
> The problem with foldl is that since
> Haskell is lazy, instead of evaluating things as it goes along, it builds
> up a huge string of thunks (=unevaluated expressions) and doesn't even
> start evaluating anything until it reaches the end of the list, which can
> easily blow the stack. foldl' is a strict version of foldl which forces
> evaluation to take place as it goes along. For an excellent explanation of
> all of this, I suggest you read
> http://haskell.org/haskellwiki/Stack_overflow.
>
> As soon as I replaced foldl with foldl' in your code, it no longer
> overflows the stack -- however, it's still quite slow! I didn't wait long
> enough for it to finish when I ran it up to a million.
45 seconds on my 1200MHz thing, not incredibly fast, but not obscenely slow
either.
> I don't have any
> advice on that front at the moment, perhaps someone else will come along
> with a suggestion or two. In the meantime, you can poke around
> http://haskell.org/haskellwiki/Performance to see if it gives you any
> ideas.
>
> Hope this helps,
> -Brent
Cheers,
Daniel
More information about the Haskell-Cafe
mailing list