From: simonmar Date: Thu, 1 Mar 2001 15:58:28 +0000 (+0000) Subject: [project @ 2001-03-01 15:58:28 by simonmar] X-Git-Tag: Approximately_9120_patches~2498 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=aa3f26d12d8df7f1e5c9df6701511e9546d0369f;p=ghc-hetmet.git [project @ 2001-03-01 15:58:28 by simonmar] add foldl', a strict foldl --- diff --git a/ghc/compiler/utils/Util.lhs b/ghc/compiler/utils/Util.lhs index b351729..7cb7a3d 100644 --- a/ghc/compiler/utils/Util.lhs +++ b/ghc/compiler/utils/Util.lhs @@ -37,24 +37,20 @@ module Util ( transitiveClosure, -- accumulating - mapAccumL, mapAccumR, mapAccumB, foldl2, count, + mapAccumL, mapAccumR, mapAccumB, + foldl2, count, -- comparisons thenCmp, cmpList, prefixMatch, suffixMatch, -- strictness - seqList, ($!), + foldl', seqList, -- pairs IF_NOT_GHC(cfst COMMA applyToPair COMMA applyToFst COMMA) IF_NOT_GHC(applyToSnd COMMA foldPair COMMA) unzipWith - -- I/O -#if __GLASGOW_HASKELL__ < 402 - , bracket -#endif - , global , myGetProcessID @@ -611,6 +607,16 @@ mapAccumB f a b (x:xs) = (a'',b'',y:ys) (a'',b',ys) = mapAccumB f a' b xs \end{code} +A strict version of foldl. + +\begin{code} +foldl' :: (a -> b -> a) -> a -> [b] -> a +foldl' f z xs = lgo z xs + where + lgo z [] = z + lgo z (x:xs) = (lgo $! (f z x)) xs +\end{code} + A combination of foldl with zip. It works with equal length lists. \begin{code} @@ -700,29 +706,9 @@ unzipWith f pairs = map ( \ (a, b) -> f a b ) pairs \end{code} \begin{code} -#if __HASKELL1__ > 4 seqList :: [a] -> b -> b -#else -seqList :: (Eval a) => [a] -> b -> b -#endif seqList [] b = b seqList (x:xs) b = x `seq` seqList xs b - -#if __HASKELL1__ <= 4 -($!) :: (Eval a) => (a -> b) -> a -> b -f $! x = x `seq` f x -#endif -\end{code} - -\begin{code} -#if __GLASGOW_HASKELL__ < 402 -bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c -bracket before after thing = do - a <- before - r <- (thing a) `catch` (\err -> after a >> fail err) - after a - return r -#endif \end{code} Global variables: