1 {-# OPTIONS -fno-implicit-prelude #-}
2 -----------------------------------------------------------------------------
5 -- Copyright : (c) The University of Glasgow 2001
6 -- License : BSD-style (see the file libraries/core/LICENSE)
8 -- Maintainer : libraries@haskell.org
9 -- Stability : provisional
10 -- Portability : portable
12 -- $Id: List.hs,v 1.1 2001/06/28 14:15:02 simonmar Exp $
14 -- Operations on lists.
16 -----------------------------------------------------------------------------
22 , elemIndex -- :: (Eq a) => a -> [a] -> Maybe Int
23 , elemIndices -- :: (Eq a) => a -> [a] -> [Int]
25 , find -- :: (a -> Bool) -> [a] -> Maybe a
26 , findIndex -- :: (a -> Bool) -> [a] -> Maybe Int
27 , findIndices -- :: (a -> Bool) -> [a] -> [Int]
29 , nub -- :: (Eq a) => [a] -> [a]
30 , nubBy -- :: (a -> a -> Bool) -> [a] -> [a]
32 , delete -- :: (Eq a) => a -> [a] -> [a]
33 , deleteBy -- :: (a -> a -> Bool) -> a -> [a] -> [a]
34 , (\\) -- :: (Eq a) => [a] -> [a] -> [a]
35 , deleteFirstsBy
-- :: (a -> a -> Bool) -> [a] -> [a] -> [a]
37 , union -- :: (Eq a) => [a] -> [a] -> [a]
38 , unionBy -- :: (a -> a -> Bool) -> [a] -> [a] -> [a]
40 , intersect -- :: (Eq a) => [a] -> [a] -> [a]
41 , intersectBy -- :: (a -> a -> Bool) -> [a] -> [a] -> [a]
43 , intersperse -- :: a -> [a] -> [a]
44 , transpose -- :: [[a]] -> [[a]]
45 , partition -- :: (a -> Bool) -> [a] -> ([a], [a])
47 , group -- :: Eq a => [a] -> [[a]]
48 , groupBy -- :: (a -> a -> Bool) -> [a] -> [[a]]
50 , inits -- :: [a] -> [[a]]
51 , tails -- :: [a] -> [[a]]
53 , isPrefixOf -- :: (Eq a) => [a] -> [a] -> Bool
54 , isSuffixOf -- :: (Eq a) => [a] -> [a] -> Bool
56 , mapAccumL -- :: (a -> b -> (a,c)) -> a -> [b] -> (a,[c])
57 , mapAccumR -- :: (a -> b -> (a,c)) -> a -> [b] -> (a,[c])
59 , sort -- :: (Ord a) => [a] -> [a]
60 , sortBy -- :: (a -> a -> Ordering) -> [a] -> [a]
62 , insert -- :: (Ord a) => a -> [a] -> [a]
63 , insertBy -- :: (a -> a -> Ordering) -> a -> [a] -> [a]
65 , maximumBy -- :: (a -> a -> Ordering) -> [a] -> a
66 , minimumBy -- :: (a -> a -> Ordering) -> [a] -> a
68 , genericLength -- :: (Integral a) => [b] -> a
69 , genericTake -- :: (Integral a) => a -> [b] -> [b]
70 , genericDrop -- :: (Integral a) => a -> [b] -> [b]
71 , genericSplitAt -- :: (Integral a) => a -> [b] -> ([b], [b])
72 , genericIndex -- :: (Integral a) => [b] -> a -> b
73 , genericReplicate -- :: (Integral a) => a -> b -> [b]
75 , unfoldr -- :: (b -> Maybe (a, b)) -> b -> [a]
77 , zip4, zip5, zip6, zip7
78 , zipWith4, zipWith5, zipWith6, zipWith7
79 , unzip4, unzip5, unzip6, unzip7
81 , map -- :: ( a -> b ) -> [a] -> [b]
82 , (++) -- :: [a] -> [a] -> [a]
83 , concat -- :: [[a]] -> [a]
84 , filter -- :: (a -> Bool) -> [a] -> [a]
87 , tail -- :: [a] -> [a]
88 , init -- :: [a] -> [a]
89 , null -- :: [a] -> Bool
90 , length -- :: [a] -> Int
91 , (!!) -- :: [a] -> Int -> a
92 , foldl -- :: (a -> b -> a) -> a -> [b] -> a
93 , foldl1 -- :: (a -> a -> a) -> [a] -> a
94 , scanl -- :: (a -> b -> a) -> a -> [b] -> [a]
95 , scanl1 -- :: (a -> a -> a) -> [a] -> [a]
96 , foldr -- :: (a -> b -> b) -> b -> [a] -> b
97 , foldr1 -- :: (a -> a -> a) -> [a] -> a
98 , scanr -- :: (a -> b -> b) -> b -> [a] -> [b]
99 , scanr1 -- :: (a -> a -> a) -> [a] -> [a]
100 , iterate -- :: (a -> a) -> a -> [a]
101 , repeat -- :: a -> [a]
102 , replicate -- :: Int -> a -> [a]
103 , cycle -- :: [a] -> [a]
104 , take -- :: Int -> [a] -> [a]
105 , drop -- :: Int -> [a] -> [a]
106 , splitAt -- :: Int -> [a] -> ([a], [a])
107 , takeWhile -- :: (a -> Bool) -> [a] -> [a]
108 , dropWhile -- :: (a -> Bool) -> [a] -> [a]
109 , span
-- :: (a -> Bool) -> [a] -> ([a], [a])
110 , break -- :: (a -> Bool) -> [a] -> ([a], [a])
112 , lines -- :: String -> [String]
113 , words -- :: String -> [String]
114 , unlines -- :: [String] -> String
115 , unwords -- :: [String] -> String
116 , reverse -- :: [a] -> [a]
117 , and -- :: [Bool] -> Bool
118 , or -- :: [Bool] -> Bool
119 , any -- :: (a -> Bool) -> [a] -> Bool
120 , all -- :: (a -> Bool) -> [a] -> Bool
121 , elem -- :: a -> [a] -> Bool
122 , notElem -- :: a -> [a] -> Bool
123 , lookup -- :: (Eq a) => a -> [(a,b)] -> Maybe b
124 , sum -- :: (Num a) => [a] -> a
125 , product -- :: (Num a) => [a] -> a
126 , maximum -- :: (Ord a) => [a] -> a
127 , minimum -- :: (Ord a) => [a] -> a
128 , concatMap -- :: (a -> [b]) -> [a] -> [b]
129 , zip -- :: [a] -> [b] -> [(a,b)]
131 , zipWith -- :: (a -> b -> c) -> [a] -> [b] -> [c]
133 , unzip -- :: [(a,b)] -> ([a],[b])
140 #ifdef __GLASGOW_HASKELL__
144 import GHC
.Show ( lines, words, unlines, unwords )
150 -- -----------------------------------------------------------------------------
153 elemIndex :: Eq a
=> a
-> [a
] -> Maybe Int
154 elemIndex x
= findIndex (x
==)
156 elemIndices :: Eq a
=> a
-> [a
] -> [Int]
157 elemIndices x
= findIndices (x
==)
159 find :: (a
-> Bool) -> [a
] -> Maybe a
160 find p
= listToMaybe . filter p
162 findIndex :: (a
-> Bool) -> [a
] -> Maybe Int
163 findIndex p
= listToMaybe . findIndices p
165 findIndices :: (a
-> Bool) -> [a
] -> [Int]
167 #ifdef USE_REPORT_PRELUDE
168 findIndices p xs
= [ i |
(x
,i
) <- zip xs
[0..], p x
]
171 findIndices p xs
= [ i |
(x
,i
) <- zip xs
[0..], p x
]
173 -- Efficient definition
174 findIndices p ls
= loop
0# ls
177 loop n
(x
:xs
) | p x
= I
# n
: loop
(n
+# 1#) xs
178 |
otherwise = loop
(n
+# 1#) xs
179 #endif
/* __HUGS__
*/
180 #endif
/* USE_REPORT_PRELUDE
*/
182 isPrefixOf :: (Eq a
) => [a
] -> [a
] -> Bool
183 isPrefixOf [] _
= True
184 isPrefixOf _
[] = False
185 isPrefixOf (x
:xs
) (y
:ys
)= x
== y
&& isPrefixOf xs ys
187 isSuffixOf :: (Eq a
) => [a
] -> [a
] -> Bool
188 isSuffixOf x y
= reverse x `
isPrefixOf`
reverse y
190 -- nub (meaning "essence") remove duplicate elements from its list argument.
191 nub :: (Eq a
) => [a
] -> [a
]
192 #ifdef USE_REPORT_PRELUDE
196 nub l
= nub' l
[] -- '
200 | x `
elem` ls
= nub' xs ls
-- '
201 |
otherwise = x
: nub' xs
(x
:ls
) -- '
204 nubBy :: (a
-> a
-> Bool) -> [a
] -> [a
]
205 #ifdef USE_REPORT_PRELUDE
207 nubBy eq
(x
:xs
) = x
: nubBy eq
(filter (\ y
-> not (eq x y
)) xs
)
209 nubBy eq l
= nubBy' l
[]
213 | elem_by eq y xs
= nubBy' ys xs
214 |
otherwise = y
: nubBy' ys
(y
:xs
)
217 -- Note that we keep the call to `eq` with arguments in the
218 -- same order as in the reference implementation
219 -- 'xs' is the list of things we've seen so far,
220 -- 'y' is the potential new element
221 elem_by
:: (a
-> a
-> Bool) -> a
-> [a
] -> Bool
222 elem_by _ _
[] = False
223 elem_by eq y
(x
:xs
) = x `eq` y || elem_by eq y xs
227 -- delete x removes the first occurrence of x from its list argument.
228 delete :: (Eq a
) => a
-> [a
] -> [a
]
229 delete = deleteBy (==)
231 deleteBy :: (a
-> a
-> Bool) -> a
-> [a
] -> [a
]
233 deleteBy eq x
(y
:ys
) = if x `eq` y
then ys
else y
: deleteBy eq x ys
235 -- list difference (non-associative). In the result of xs \\ ys,
236 -- the first occurrence of each element of ys in turn (if any)
237 -- has been removed from xs. Thus, (xs ++ ys) \\ xs == ys.
238 (\\) :: (Eq a
) => [a
] -> [a
] -> [a
]
239 (\\) = foldl (flip delete)
241 -- List union, remove the elements of first list from second.
242 union :: (Eq a
) => [a
] -> [a
] -> [a
]
245 unionBy :: (a
-> a
-> Bool) -> [a
] -> [a
] -> [a
]
246 unionBy eq xs ys
= xs
++ foldl (flip (deleteBy eq
)) (nubBy eq ys
) xs
248 intersect :: (Eq a
) => [a
] -> [a
] -> [a
]
249 intersect = intersectBy (==)
251 intersectBy :: (a
-> a
-> Bool) -> [a
] -> [a
] -> [a
]
252 intersectBy eq xs ys
= [x | x
<- xs
, any (eq x
) ys
]
254 -- intersperse sep inserts sep between the elements of its list argument.
255 -- e.g. intersperse ',' "abcde" == "a,b,c,d,e"
256 intersperse :: a
-> [a
] -> [a
]
257 intersperse _
[] = []
258 intersperse _
[x
] = [x
]
259 intersperse sep
(x
:xs
) = x
: sep
: intersperse sep xs
261 transpose :: [[a
]] -> [[a
]]
263 transpose ([] : xss
) = transpose xss
264 transpose ((x
:xs
) : xss
) = (x
: [h |
(h
:t
) <- xss
]) : transpose (xs
: [ t |
(h
:t
) <- xss
])
267 -- partition takes a predicate and a list and returns a pair of lists:
268 -- those elements of the argument list that do and do not satisfy the
269 -- predicate, respectively; i,e,,
270 -- partition p xs == (filter p xs, filter (not . p) xs).
271 partition :: (a
-> Bool) -> [a
] -> ([a
],[a
])
272 {-# INLINE partition #-}
273 partition p xs
= foldr (select p
) ([],[]) xs
275 select p x
(ts
,fs
) | p x
= (x
:ts
,fs
)
276 |
otherwise = (ts
, x
:fs
)
278 -- @mapAccumL@ behaves like a combination
279 -- of @map@ and @foldl@;
280 -- it applies a function to each element of a list, passing an accumulating
281 -- parameter from left to right, and returning a final value of this
282 -- accumulator together with the new list.
284 mapAccumL :: (acc
-> x
-> (acc
, y
)) -- Function of elt of input list
285 -- and accumulator, returning new
286 -- accumulator and elt of result list
287 -> acc
-- Initial accumulator
289 -> (acc
, [y
]) -- Final accumulator and result list
290 mapAccumL _ s
[] = (s
, [])
291 mapAccumL f s
(x
:xs
) = (s
'',y
:ys
)
292 where (s
', y
) = f s x
293 (s
'',ys
) = mapAccumL f s
' xs
295 -- @mapAccumR@ does the same, but working from right to left instead.
296 -- Its type is the same as @mapAccumL@, though.
298 mapAccumR :: (acc
-> x
-> (acc
, y
)) -- Function of elt of input list
299 -- and accumulator, returning new
300 -- accumulator and elt of result list
301 -> acc
-- Initial accumulator
303 -> (acc
, [y
]) -- Final accumulator and result list
304 mapAccumR _ s
[] = (s
, [])
305 mapAccumR f s
(x
:xs
) = (s
'', y
:ys
)
306 where (s
'',y
) = f s
' x
307 (s
', ys
) = mapAccumR f s xs
310 insert :: Ord a
=> a
-> [a
] -> [a
]
311 insert e ls
= insertBy (compare) e ls
313 insertBy :: (a
-> a
-> Ordering) -> a
-> [a
] -> [a
]
314 insertBy _ x
[] = [x
]
315 insertBy cmp x ys
@(y
:ys
')
317 GT
-> y
: insertBy cmp x ys
'
320 maximumBy :: (a
-> a
-> a
) -> [a
] -> a
321 maximumBy _
[] = error "List.maximumBy: empty list"
322 maximumBy max xs
= foldl1 max xs
324 minimumBy :: (a
-> a
-> a
) -> [a
] -> a
325 minimumBy _
[] = error "List.minimumBy: empty list"
326 minimumBy min xs
= foldl1 min xs
328 genericLength :: (Num i
) => [b
] -> i
330 genericLength (_
:l
) = 1 + genericLength l
332 genericTake :: (Integral i
) => i
-> [a
] -> [a
]
334 genericTake _
[] = []
335 genericTake n
(x
:xs
) | n
> 0 = x
: genericTake (n
-1) xs
336 genericTake _ _
= error "List.genericTake: negative argument"
338 genericDrop :: (Integral i
) => i
-> [a
] -> [a
]
339 genericDrop 0 xs
= xs
340 genericDrop _
[] = []
341 genericDrop n
(_
:xs
) | n
> 0 = genericDrop (n
-1) xs
342 genericDrop _ _
= error "List.genericDrop: negative argument"
344 genericSplitAt :: (Integral i
) => i
-> [b
] -> ([b
],[b
])
345 genericSplitAt 0 xs
= ([],xs
)
346 genericSplitAt _
[] = ([],[])
347 genericSplitAt n
(x
:xs
) | n
> 0 = (x
:xs
',xs
'') where
348 (xs
',xs
'') = genericSplitAt (n
-1) xs
349 genericSplitAt _ _
= error "List.genericSplitAt: negative argument"
352 genericIndex :: (Integral a
) => [b
] -> a
-> b
353 genericIndex (x
:_
) 0 = x
354 genericIndex (_
:xs
) n
355 | n
> 0 = genericIndex xs
(n
-1)
356 |
otherwise = error "List.genericIndex: negative argument."
357 genericIndex _ _
= error "List.genericIndex: index too large."
359 genericReplicate :: (Integral i
) => i
-> a
-> [a
]
360 genericReplicate n x
= genericTake n
(repeat x
)
363 zip4 :: [a
] -> [b
] -> [c
] -> [d
] -> [(a
,b
,c
,d
)]
364 zip4 = zipWith4 (,,,)
366 zip5 :: [a
] -> [b
] -> [c
] -> [d
] -> [e
] -> [(a
,b
,c
,d
,e
)]
367 zip5 = zipWith5 (,,,,)
369 zip6 :: [a
] -> [b
] -> [c
] -> [d
] -> [e
] -> [f
] ->
371 zip6 = zipWith6 (,,,,,)
373 zip7 :: [a
] -> [b
] -> [c
] -> [d
] -> [e
] -> [f
] ->
374 [g
] -> [(a
,b
,c
,d
,e
,f
,g
)]
375 zip7 = zipWith7 (,,,,,,)
377 zipWith4 :: (a
->b
->c
->d
->e
) -> [a
]->[b
]->[c
]->[d
]->[e
]
378 zipWith4 z
(a
:as) (b
:bs
) (c
:cs
) (d
:ds
)
379 = z a b c d
: zipWith4 z
as bs cs ds
380 zipWith4 _ _ _ _ _
= []
382 zipWith5 :: (a
->b
->c
->d
->e
->f
) ->
383 [a
]->[b
]->[c
]->[d
]->[e
]->[f
]
384 zipWith5 z
(a
:as) (b
:bs
) (c
:cs
) (d
:ds
) (e
:es
)
385 = z a b c d e
: zipWith5 z
as bs cs ds es
386 zipWith5 _ _ _ _ _ _
= []
388 zipWith6 :: (a
->b
->c
->d
->e
->f
->g
) ->
389 [a
]->[b
]->[c
]->[d
]->[e
]->[f
]->[g
]
390 zipWith6 z
(a
:as) (b
:bs
) (c
:cs
) (d
:ds
) (e
:es
) (f
:fs
)
391 = z a b c d e f
: zipWith6 z
as bs cs ds es fs
392 zipWith6 _ _ _ _ _ _ _
= []
394 zipWith7 :: (a
->b
->c
->d
->e
->f
->g
->h
) ->
395 [a
]->[b
]->[c
]->[d
]->[e
]->[f
]->[g
]->[h
]
396 zipWith7 z
(a
:as) (b
:bs
) (c
:cs
) (d
:ds
) (e
:es
) (f
:fs
) (g
:gs
)
397 = z a b c d e f g
: zipWith7 z
as bs cs ds es fs gs
398 zipWith7 _ _ _ _ _ _ _ _
= []
400 unzip4 :: [(a
,b
,c
,d
)] -> ([a
],[b
],[c
],[d
])
401 unzip4 = foldr (\(a
,b
,c
,d
) ~
(as,bs
,cs
,ds
) ->
402 (a
:as,b
:bs
,c
:cs
,d
:ds
))
405 unzip5 :: [(a
,b
,c
,d
,e
)] -> ([a
],[b
],[c
],[d
],[e
])
406 unzip5 = foldr (\(a
,b
,c
,d
,e
) ~
(as,bs
,cs
,ds
,es
) ->
407 (a
:as,b
:bs
,c
:cs
,d
:ds
,e
:es
))
410 unzip6 :: [(a
,b
,c
,d
,e
,f
)] -> ([a
],[b
],[c
],[d
],[e
],[f
])
411 unzip6 = foldr (\(a
,b
,c
,d
,e
,f
) ~
(as,bs
,cs
,ds
,es
,fs
) ->
412 (a
:as,b
:bs
,c
:cs
,d
:ds
,e
:es
,f
:fs
))
415 unzip7 :: [(a
,b
,c
,d
,e
,f
,g
)] -> ([a
],[b
],[c
],[d
],[e
],[f
],[g
])
416 unzip7 = foldr (\(a
,b
,c
,d
,e
,f
,g
) ~
(as,bs
,cs
,ds
,es
,fs
,gs
) ->
417 (a
:as,b
:bs
,c
:cs
,d
:ds
,e
:es
,f
:fs
,g
:gs
))
418 ([],[],[],[],[],[],[])
422 deleteFirstsBy
:: (a
-> a
-> Bool) -> [a
] -> [a
] -> [a
]
423 deleteFirstsBy eq
= foldl (flip (deleteBy eq
))
426 -- group splits its list argument into a list of lists of equal, adjacent
428 -- group "Mississippi" == ["M","i","ss","i","ss","i","pp","i"]
429 group :: (Eq a
) => [a
] -> [[a
]]
432 groupBy :: (a
-> a
-> Bool) -> [a
] -> [[a
]]
434 groupBy eq
(x
:xs
) = (x
:ys
) : groupBy eq zs
435 where (ys
,zs
) = span
(eq x
) xs
437 -- inits xs returns the list of initial segments of xs, shortest first.
438 -- e.g., inits "abc" == ["","a","ab","abc"]
439 inits :: [a
] -> [[a
]]
441 inits (x
:xs
) = [[]] ++ map (x
:) (inits xs
)
443 -- tails xs returns the list of all final segments of xs, longest first.
444 -- e.g., tails "abc" == ["abc", "bc", "c",""]
445 tails :: [a
] -> [[a
]]
447 tails xxs
@(_
:xs
) = xxs
: tails xs
450 ------------------------------------------------------------------------------
451 -- Quick Sort algorithm taken from HBC's QSort library.
453 sort :: (Ord a
) => [a
] -> [a
]
454 sortBy :: (a
-> a
-> Ordering) -> [a
] -> [a
]
456 #ifdef USE_REPORT_PRELUDE
457 sort = sortBy compare
458 sortBy cmp
= foldr (insertBy cmp
) []
461 sortBy cmp l
= qsort cmp l
[]
462 sort l
= qsort
compare l
[]
464 -- rest is not exported:
466 -- qsort is stable and does not concatenate.
467 qsort
:: (a
-> a
-> Ordering) -> [a
] -> [a
] -> [a
]
470 qsort cmp
(x
:xs
) r
= qpart cmp x xs
[] [] r
472 -- qpart partitions and sorts the sublists
473 qpart
:: (a
-> a
-> Ordering) -> a
-> [a
] -> [a
] -> [a
] -> [a
] -> [a
]
474 qpart cmp x
[] rlt rge r
=
475 -- rlt and rge are in reverse order and must be sorted with an
476 -- anti-stable sorting
477 rqsort cmp rlt
(x
:rqsort cmp rge r
)
478 qpart cmp x
(y
:ys
) rlt rge r
=
480 GT
-> qpart cmp x ys
(y
:rlt
) rge r
481 _
-> qpart cmp x ys rlt
(y
:rge
) r
483 -- rqsort is as qsort but anti-stable, i.e. reverses equal elements
484 rqsort
:: (a
-> a
-> Ordering) -> [a
] -> [a
] -> [a
]
487 rqsort cmp
(x
:xs
) r
= rqpart cmp x xs
[] [] r
489 rqpart
:: (a
-> a
-> Ordering) -> a
-> [a
] -> [a
] -> [a
] -> [a
] -> [a
]
490 rqpart cmp x
[] rle rgt r
=
491 qsort cmp rle
(x
:qsort cmp rgt r
)
492 rqpart cmp x
(y
:ys
) rle rgt r
=
494 GT
-> rqpart cmp x ys rle
(y
:rgt
) r
495 _
-> rqpart cmp x ys
(y
:rle
) rgt r
497 #endif
/* USE_REPORT_PRELUDE
*/
501 unfoldr f' (foldr f z xs) == (z,xs)
503 if the following holds:
505 f' (f x y) = Just (x,y)
510 unfoldr :: (b
-> Maybe (a
, b
)) -> b
-> [a
]
513 Just
(a
,new_b
) -> a
: unfoldr f new_b
516 -- -----------------------------------------------------------------------------
517 -- List sum and product
519 -- sum and product compute the sum or product of a finite list of numbers.
520 {-# SPECIALISE sum :: [Int] -> Int #-}
521 {-# SPECIALISE sum :: [Integer] -> Integer #-}
522 {-# SPECIALISE product :: [Int] -> Int #-}
523 {-# SPECIALISE product :: [Integer] -> Integer #-}
524 sum, product :: (Num a
) => [a
] -> a
525 #ifdef USE_REPORT_PRELUDE
527 product = foldl (*) 1
532 sum' (x
:xs
) a
= sum' xs
(a
+x
)
536 prod
(x
:xs
) a
= prod xs
(a
*x
)