Difference between revisions of "Prelude extensions"

From HaskellWiki
Jump to navigation Jump to search
 
(Functions on tuples, mapFst, mapSnd, mapPair)
Line 1: Line 1:
 
 
 
== Sorted lists ==
 
== Sorted lists ==
   
 
The following are versions of standard prelude functions, but intended for sorted lists. The advantage is that they frequently reduce execution time by an O(n). The disadvantage is that the elements have to be members of Ord, and the lists have to be already sorted.
 
The following are versions of standard prelude functions, but intended for sorted lists. The advantage is that they frequently reduce execution time by an O(n). The disadvantage is that the elements have to be members of Ord, and the lists have to be already sorted.
   
  +
<haskell>
 
-- Eliminates duplicate entries from the list, where duplication is defined
 
-- Eliminates duplicate entries from the list, where duplication is defined
 
-- by the 'eq' function. The last value is kept.
 
-- by the 'eq' function. The last value is kept.
Line 27: Line 26:
 
merge :: (Ord a) => [a] -> [a] -> [a]
 
merge :: (Ord a) => [a] -> [a] -> [a]
 
merge = mergeBy compare
 
merge = mergeBy compare
  +
</haskell>
  +
  +
  +
== Tuples ==
  +
  +
It is often necessary to apply functions to either the first or the second part of a pair. This is often considered a form of mapping (like map from Data.List).
  +
  +
<haskell>
  +
-- | Apply a function to the first element of a pair
  +
mapFst :: (a -> c) -> (a, b) -> (c, b)
  +
mapFst f (a, b) = (f a, b)
  +
  +
-- | Apply a function to the second element of a pair
  +
mapSnd :: (b -> c) -> (a, b) -> (c, b)
  +
mapSnd f (a, b) = (a, f b)
  +
  +
-- | Apply a function to both elements of a pair
  +
mapPair :: (a -> c, b -> d) -> (a, b) -> (c, d)
  +
mapPair (f, g) (a, b) = (f a, g b)
  +
</haskell>

Revision as of 18:01, 23 April 2006

Sorted lists

The following are versions of standard prelude functions, but intended for sorted lists. The advantage is that they frequently reduce execution time by an O(n). The disadvantage is that the elements have to be members of Ord, and the lists have to be already sorted.

 -- Eliminates duplicate entries from the list, where duplication is defined
 -- by the 'eq' function.  The last value is kept.
 sortedNubBy :: (a -> a -> Bool) -> [a] -> [a]
 sortedNubBy eq (x1 : xs@(x2 : _)) =
    if eq x1 x2 then sortedNubBy eq xs else x1 : sortedNubBy eq xs
 sortedNubBy _ xs = xs

 sortedNub :: (Eq a) => [a] -> [a]
 sortedNub = sortedNubBy (==)

 -- Merge two sorted lists into a new sorted list.  Where elements are equal
 -- the element from the first list is taken first.
 mergeBy :: (a -> a -> Ordering) -> [a] -> [a] -> [a]
 mergeBy cmp xs@(x1:xs1) ys@(y1:ys1) =
    if cmp x1 y1 == GT
       then y1 : mergeBy cmp xs ys1
       else x1 : mergeBy cmp xs1 ys
 mergeBy _ [] ys = ys
 mergeBy _ xs [] = xs

 merge :: (Ord a) => [a] -> [a] -> [a]
 merge = mergeBy compare


Tuples

It is often necessary to apply functions to either the first or the second part of a pair. This is often considered a form of mapping (like map from Data.List).

 -- | Apply a function to the first element of a pair
 mapFst :: (a -> c) -> (a, b) -> (c, b)
 mapFst f (a, b) = (f a, b)
 
 -- | Apply a function to the second element of a pair
 mapSnd :: (b -> c) -> (a, b) -> (c, b)
 mapSnd f (a, b) = (a, f b)
 
 -- | Apply a function to both elements of a pair
 mapPair :: (a -> c, b -> d) -> (a, b) -> (c, d)
 mapPair (f, g) (a, b) = (f a, g b)