foldl laziness support

Serge D. Mechveliani mechvel at botik.ru
Sun Oct 15 10:05:43 EDT 2006


Dear Haskell implementors,

I keep on facing a frightening problem of the laziness support.
Consider the example of

-----------------------------------
import List (union)

main = let n = 10^4 :: Int
       in
       putStr
       (shows (take 2 $ unionMany [[1 .. i] | i <- [1 .. n]]) "\n")

unionMany = foldl union []
-----------------------------------

Compiling it in   ghc-6.6,  -O, 

we have the running cost  O(n),  instead of  O(1).

Now, changing to 

  unionMany []        =  []
  unionMany (xs: xss) =  union xs (unionMany xss)
,
we reach  O(1).
For example, for  n = 10^9,  the time remains less than   0.01 sec.

My program has many fragments of such kind, when a function produces
a long list, some client functions need all the list, and others need
only its small initial part.
When we rely on the standard library,  foldl  creeps in everywhere.
Also may things are easy to program via  foldl.

I wonder how to avoid these numerous cost pitfalls.
Maybe, the complier could do more optimization?

Regards,

-----------------
Serge Mechveliani
mechvel at botik.ru


More information about the Glasgow-haskell-users mailing list