Make Foldable's foldr1 and foldl1 defaults lazier
authorDavid Feuer <David.Feuer@gmail.com>
Tue, 4 Nov 2014 09:03:12 +0000 (10:03 +0100)
committerHerbert Valerio Riedel <hvr@gnu.org>
Tue, 4 Nov 2014 09:06:13 +0000 (10:06 +0100)
Fixes #9742. Previously, `foldr1` as applied to a list-like
structure would be strict in the spine, and `foldl1` would
be strict in the spine of a snoc-list.

See also

 https://www.haskell.org/pipermail/libraries/2014-October/024035.html

Differential Revision: https://phabricator.haskell.org/D423

libraries/base/Data/Foldable.hs

index 75460bb..a855090 100644 (file)
@@ -130,8 +130,9 @@ class Foldable t where
     foldr1 f xs = fromMaybe (error "foldr1: empty structure")
                     (foldr mf Nothing xs)
       where
     foldr1 f xs = fromMaybe (error "foldr1: empty structure")
                     (foldr mf Nothing xs)
       where
-        mf x Nothing = Just x
-        mf x (Just y) = Just (f x y)
+        mf x m = Just (case m of
+                         Nothing -> x
+                         Just y  -> f x y)
 
     -- | A variant of 'foldl' that has no base case,
     -- and thus may only be applied to non-empty structures.
 
     -- | A variant of 'foldl' that has no base case,
     -- and thus may only be applied to non-empty structures.
@@ -141,8 +142,9 @@ class Foldable t where
     foldl1 f xs = fromMaybe (error "foldl1: empty structure")
                     (foldl mf Nothing xs)
       where
     foldl1 f xs = fromMaybe (error "foldl1: empty structure")
                     (foldl mf Nothing xs)
       where
-        mf Nothing y = Just y
-        mf (Just x) y = Just (f x y)
+        mf m y = Just (case m of
+                         Nothing -> y
+                         Just x  -> f x y)
 
     -- | List of elements of a structure.
     toList :: Foldable t => t a -> [a]
 
     -- | List of elements of a structure.
     toList :: Foldable t => t a -> [a]