Evaluation order, ghc versus hugs, lazy vs. strict

Jan Kybic kybic@ieee.org
20 Aug 2002 10:43:39 +0200


>As you've apparently discovered, the trick is to be lazy but not too
>lazy.  That is, you want to generate the list lazily but compute a
>partial result (i.e., the running total of that part of the list
>processed so far) strictly.

Thanks for all reactions. Now my simplified examples 
indeed run in constant space.  Unfortunatelly, my original code
still suffer from the same problem and even '-O2' does not help.

>More importantly, understand how foldl' works and be ready to
>apply the same analysis and fix to any similar function.  

This is what I cannot do for the moment. How do I find out what is
really going on. Any pointers to a relevant
articles/literature? As an example, here is my earlier attempt
to define strictFoldl1:

 strictFoldl1' f (a:b:c) = let strictFoldl1' f a (b:c) = 
			       let fab = seq a $ seq b $ f a b 
	     		       in case c of
	          		   [] -> fab
		                   otherwise -> seq fab (strictFoldl1' f fab c)
		         in strictFoldl1' f a (b:c)

However, it does not seem to do the trick, why Alastair's code does it:

  foldl'           :: (a -> b -> a) -> a -> [b] -> a
  foldl' f a []     = a
  foldl' f a (x:xs) = (foldl' f $! f a x) xs
  foldl1' f (x:xs) = foldl' f x xs


Thanks.

Jan



-- 
-------------------------------------------------------------------------
Jan Kybic <kybic@ieee.org>      Odyssee, INRIA, Sophia-Antipolis, France
       or <Jan.Kybic@sophia.inria.fr>,tel. work +33 492 38 7589, fax 7845
                    http://www-sop.inria.fr/robotvis/personnel/Jan.Kybic/