List.partition should be more lazy

Simon Peyton-Jones simonpj@microsoft.com
Fri, 23 Nov 2001 07:08:10 -0800


It was wrong in the Haskell report too (now fixed; see my home page).
Also fixed in GHC 5.02.

Simon

| -----Original Message-----
| From: Bastiaan Heeren [mailto:bastiaan@cs.uu.nl]=20
| Sent: 23 November 2001 13:55
| To: haskell@haskell.org
| Subject: List.partition should be more lazy
|=20
|=20
| Using the function partition from the List module, a control=20
| stack overflow occurs when evaluating the following expression:
|=20
|=20
|      List> head $ fst $ partition even [1..]
|=20
|      (35929 reductions, 63867 cells)
|      ERROR: Control stack overflow
|=20
|=20
| The definition of partition in both hugs and GHC libraries is:
|=20
|=20
|      partition      :: (a -> Bool) -> [a] -> ([a],[a])
|      partition p xs  =3D foldr select ([],[]) xs
|                      where select x (ts,fs) | p x       =3D (x:ts,fs)
|                                             | otherwise =3D (ts,x:fs)
|=20
|=20
| The helper-function select is strict in its second argument=20
| because of the pattern match on the tuple (ts,fs). Making the=20
| pattern match lazy by adding a ~ solves the problem!
|=20
|        =20
|      partition     :: (a -> Bool) -> [a] -> ([a],[a])
|      partition p xs =3D foldr select ([],[]) xs
|                     where select x ~(ts,fs) | p x       =3D (x:ts,fs)
|                                             | otherwise =3D (ts,x:fs)
|                                            =20
|=20
| Cheers,
|   Bastiaan=20
|=20
|=20
| _______________________________________________
| Haskell mailing list
| Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell
|=20