X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Data%2FList.hs;h=2a37187899045ffd11198db16aa80c76f5d99d1a;hb=9fa9bc17072a58c0bae2cce4764d38677e96ac29;hp=ce4c9b32f23ebbe886a168baea5a4b6f51035013;hpb=7f1f4e7a695c402ddd3a1dc2cc7114e649a78ebc;p=ghc-base.git diff --git a/Data/List.hs b/Data/List.hs index ce4c9b3..2a37187 100644 --- a/Data/List.hs +++ b/Data/List.hs @@ -1,6 +1,6 @@ {-# OPTIONS -fno-implicit-prelude #-} ----------------------------------------------------------------------------- --- +-- | -- Module : Data.List -- Copyright : (c) The University of Glasgow 2001 -- License : BSD-style (see the file libraries/core/LICENSE) @@ -9,7 +9,7 @@ -- Stability : provisional -- Portability : portable -- --- $Id: List.hs,v 1.1 2001/06/28 14:15:02 simonmar Exp $ +-- $Id: List.hs,v 1.4 2002/04/24 16:31:39 simonmar Exp $ -- -- Operations on lists. -- @@ -90,6 +90,7 @@ module Data.List , length -- :: [a] -> Int , (!!) -- :: [a] -> Int -> a , foldl -- :: (a -> b -> a) -> a -> [b] -> a + , foldl' -- :: (a -> b -> a) -> a -> [b] -> a , foldl1 -- :: (a -> a -> a) -> [a] -> a , scanl -- :: (a -> b -> a) -> a -> [b] -> [a] , scanl1 -- :: (a -> a -> a) -> [a] -> [a] @@ -317,13 +318,21 @@ insertBy cmp x ys@(y:ys') GT -> y : insertBy cmp x ys' _ -> x : ys -maximumBy :: (a -> a -> a) -> [a] -> a -maximumBy _ [] = error "List.maximumBy: empty list" -maximumBy max xs = foldl1 max xs - -minimumBy :: (a -> a -> a) -> [a] -> a -minimumBy _ [] = error "List.minimumBy: empty list" -minimumBy min xs = foldl1 min xs +maximumBy :: (a -> a -> Ordering) -> [a] -> a +maximumBy _ [] = error "List.maximumBy: empty list" +maximumBy cmp xs = foldl1 max xs + where + max x y = case cmp x y of + GT -> x + _ -> y + +minimumBy :: (a -> a -> Ordering) -> [a] -> a +minimumBy _ [] = error "List.minimumBy: empty list" +minimumBy cmp xs = foldl1 min xs + where + min x y = case cmp x y of + GT -> y + _ -> x genericLength :: (Num i) => [b] -> i genericLength [] = 0 @@ -513,6 +522,14 @@ unfoldr f b = Just (a,new_b) -> a : unfoldr f new_b Nothing -> [] + +-- ----------------------------------------------------------------------------- +-- strict version of foldl + +foldl' :: (a -> b -> a) -> a -> [b] -> a +foldl' f a [] = a +foldl' f a (x:xs) = let a' = f a x in a' `seq` foldl' f a' xs + -- ----------------------------------------------------------------------------- -- List sum and product