Why is partition no good list producer?

Jan Scheffczyk jan at informatik.unibw-muenchen.de
Wed Feb 25 10:44:16 EST 2004


Hi all,

I'm about to optimize a fairly large Haskell program, which uses 
partition quite often (and a fold immediately afterwards).
The GHC User guide section about RULE pragmas says that filter is a 
good producer, whereas partition is not mentioned (therefore, I 
assume it is not).

I put a little test program together:

> fuse1 :: [Bool] -> (Bool,Bool)
> fuse1 xs = (x,y)
>  where (fs,gs) = partition id xs
>        x = foldr (&&) True fs
>        y = foldr (||) False gs

> fuse2 :: [Bool] -> (Bool,Bool)
> fuse2 xs = (x,y)
>  where fs = filter id xs
>        gs = filter not xs
>        x = foldr (&&) True fs
>        y = foldr (||) False gs

Compiling it via ghc -O and loading the compiled object to ghci 
results in:

Prelude Test> fuse2 (replicate 10000000 False)
(True,False)
(8.19 secs, 241174592 bytes)
Prelude Test> fuse1 (replicate 10000000 False)
(*** Exception: stack overflow
(6.18 secs, 48472660 bytes)


I understand the results: Using partition an intermediate list seems 
to be build.
But WHY?

Is it simply because of a missing RULE pragma for partition or is 
there a "deeper" reason?

Cheers,
Jan



More information about the Glasgow-haskell-users mailing list