[Haskell-cafe] sortBy2 for List library

Serge D. Mechveliani mechvel at botik.ru
Fri Jun 23 07:39:31 EDT 2006


Consider the following suggestions for the standard Haskell library
`List'.

------------------------------------------------------------------------
import List (intersprerse, insertBy)

compose :: [a -> a] -> a -> a     -- just appropriate name
compose =  foldr (.) id

insertBy2 :: (a -> b) -> Comparison b -> a -> [a] -> [a]
insertBy2    f           cp              a    xs  =

  map fst $ insertBy (\ p p' -> cp (snd p) (snd p'))
                                           (a, f a) [(x, f x) | x <- xs]

Similar are  mergeBy2, sortBy2.

type ComparisonValue = LT | GT | Eq  deriving ... 
                                          -- better name than `Ordering'

type Comparison a    = a -> a -> ComparisonValue 
------------------------------------------------------------------------


Motivation example for `compose':

  myShowsList :: Show a => [a] -> String -> String
  myShowsList              xs  =
                          compose $ intersperse (",  "++) $ map shows xs

  myShowsList (";  "++) [1,2,3] -->  "1;  2;  3"


Motivation example for  insertBy2:
Consider the program 
                insertBy (\ n m -> compare (f n) (f m)) 100 [0 .. 1000],

where  f :: Integer -> Integer  is expensive to compute.
We see that the program
                        insertBy2 f compare 100 [1 .. 1000]

spends 2 times less of `f' invocations, and looks natural.

-----------------
Serge Mechveliani
mechvel at botik.ru



More information about the Haskell-Cafe mailing list