[Haskell-beginners] How to improve lazyness of a foldl (and memory footprint)

Brent Yorgey byorgey at seas.upenn.edu
Wed May 15 18:27:09 CEST 2013


For any associative binary operator (+) with an identity element z, foldl and
foldr are equivalent, that is,

  foldl (+) z === foldr (+) z

The first yields something like

  ((z + a) + b) + c

whereas the second yields

  a + (b + (c + z))

but with associativity and the fact that z is an identity it is not
hard to see that these are equal.  However, as you found out, that
does not necessarily mean they have the same performance!

Since atop is associative you could just replace foldl with foldr.  In
fact, atop is the binary operation for the Monoid instance of
diagrams, so you can just write 'mconcat' in place of 'foldr atop
mempty'.

-Brent

On Wed, May 15, 2013 at 09:35:34AM +0200, Giacomo Tesio wrote:
> Thanks a lot!
> 
> Yesterday on freenode's #haskell channel Cane noted how my laziness problem
> reside in the foldl use in foldTradingSample.
> I have to turn it into a foldr (but I'm still unsure how...)
> 
> 
> Giacomo
> 
> 
> On Wed, May 15, 2013 at 12:46 AM, Henk-Jan van Tuyl <hjgtuyl at chello.nl>wrote:
> 
> > On Tue, 14 May 2013 11:22:27 +0200, Giacomo Tesio <giacomo at tesio.it>
> > wrote:
> >
> >  Hi, I'm trying to improve a small haskell program of mine.
> >>
> > :
> >
> > Some remarks:
> >
> > 0) Use hlint (available on Hackage) for improvement suggestions
> > 1) You don't have to write the module heading in Main.hs, it is not a
> > library (why export main?)
> > 2) Change "print" to "putStrLn" if you want to display messages without
> > quotes
> > 2) switchArgs is only partially defined, add something like:
> >      switchArgs [x] = putStrLn $ "Unknown tool: " ++ x
> > 3) Use shorter lines, for example change:
> >
> >   importTrades outDir csvFile = transformFile csvFile (foldTradingSample.*
> > *getTickWriteTrades)   (saveTradingSamples outDir)
> >
> > to:
> >
> >   importTrades outDir csvFile =
> >     transformFile
> >       csvFile
> >       (foldTradingSample.**getTickWriteTrades)
> >       (saveTradingSamples outDir)
> > 4) It is considered good practice, to write the function
> >    composition operator between spaces (change f.g to f . g)
> >
> > I have analyze your software further to see how sufficient laziness can be
> > reached.
> >
> > Regards,
> > Henk-Jan van Tuyl
> >
> >
> > --
> > Folding at home
> > What if you could share your unused computer power to help find a cure? In
> > just 5 minutes you can join the world's biggest networked computer and get
> > us closer sooner. Watch the video.
> > http://folding.stanford.edu/
> >
> >
> > http://Van.Tuyl.eu/
> > http://members.chello.nl/**hjgtuyl/tourdemonad.html<http://members.chello.nl/hjgtuyl/tourdemonad.html>
> > Haskell programming
> > --
> >
> > ______________________________**_________________
> > Beginners mailing list
> > Beginners at haskell.org
> > http://www.haskell.org/**mailman/listinfo/beginners<http://www.haskell.org/mailman/listinfo/beginners>
> >

> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners




More information about the Beginners mailing list