A: Evaluation order, ghc versus hugs, lazy vs. strict

Jan Kybic kybic@ieee.org
22 Aug 2002 17:07:14 +0200


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

Hi,
        just a little summary of what I found, in case it might be
useful to other beginners struggling with the same problems:

* A good page is http://users.aber.ac.uk/ajc99/stricthaskell.html

* You want to think hard about which functions you want to make strict
  and which are better left lazy.

* Once you have it, the DeepSeq module together with some syntactic
  sugar permits you to annotate functions as strict easily:

  
     -- strictness annotation, to be used as
     --   f a x | strict a, deepStrict x = annotation
     --   f a x = the_true_function_body

     annotation = undefined
     strict a = seq a False
     deepStrict a = deepSeq a False

  This worked for me, nicely. In doubt, I tried both the strict and
  lazy versions... 

* Optimization often changes the behavior.

* It helps to have strict versions of some common high-order
functions, for example 

    -- strict foldl, just as foldl' 
    strictFoldl           :: (a -> b -> a) -> a -> [b] -> a
    strictFoldl f a []     = a
    strictFoldl f a (x:xs) = (strictFoldl f $! f a x) xs
    strictFoldl1 f (x:xs) = strictFoldl f x xs
          

* I could not find any tracing tool for ghc that would enable me to
  see step by step what happens. Hugs has it (look for Observe).

* The heap profiling helps but I have difficulties associating the
  entities it shows with actual code of my program.

 
Hope this helps,

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/