Ordenación por el máximo
Definir la función
| 1 |    ordenadosPorMaximo :: Ord a => [[a]] -> [[a]] | 
tal que (ordenadosPorMaximo xss) es la lista de los elementos de xss ordenada por sus máximos (se supone que los elementos de xss son listas no vacía) y cuando tiene el mismo máximo se conserva el orden original. Por ejemplo,
| 1 2 3 4 |    λ> ordenadosPorMaximo [[0,8],[9],[8,1],[6,3],[8,2],[6,1],[6,2]]    [[6,3],[6,1],[6,2],[0,8],[8,1],[8,2],[9]]    λ> ordenadosPorMaximo ["este","es","el","primero"]    ["el","primero","es","este"] | 
Soluciones
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | import Data.List (sort, sortBy) import GHC.Exts (sortWith) import Test.QuickCheck (quickCheck) -- 1ª solución ordenadosPorMaximo1 :: Ord a => [[a]] -> [[a]] ordenadosPorMaximo1 xss =   map snd (sort [((maximum xs,k),xs) | (k,xs) <- zip [0..] xss]) -- 2ª solución ordenadosPorMaximo2 :: Ord a => [[a]] -> [[a]] ordenadosPorMaximo2 xss =   [xs | (_,xs) <- sort [((maximum xs,k),xs) | (k,xs) <- zip [0..] xss]] -- 3ª solución ordenadosPorMaximo3 :: Ord a => [[a]] -> [[a]] ordenadosPorMaximo3 =   sortBy (\xs ys -> compare (maximum xs) (maximum ys)) -- 4ª solución ordenadosPorMaximo4 :: Ord a => [[a]] -> [[a]] ordenadosPorMaximo4 = sortWith maximum -- Equivalencia de las definiciones -- ================================ -- La propiedad es prop_ordenadosPorMaximo :: [[Int]] -> Bool prop_ordenadosPorMaximo xss =   all (== ordenadosPorMaximo1 yss)       [ordenadosPorMaximo2 yss,        ordenadosPorMaximo3 yss,        ordenadosPorMaximo4 yss]   where yss = filter (not . null) xss verifica_ordenadosPorMaximo :: IO () verifica_ordenadosPorMaximo =   quickCheck prop_ordenadosPorMaximo -- La comprobación es --    λ> verifica_ordenadosPorMaximo --    +++ OK, passed 100 tests. -- Comparación de eficiencia -- ========================= -- La comparación es --    λ> length (ordenadosPorMaximo1 [[1..k] | k <- [1..10^4]]) --    10000 --    (6.00 secs, 8,763,714,848 bytes) --    λ> length (ordenadosPorMaximo2 [[1..k] | k <- [1..10^4]]) --    10000 --    (6.15 secs, 8,764,177,472 bytes) --    λ> length (ordenadosPorMaximo3 [[1..k] | k <- [1..10^4]]) --    10000 --    (8.16 secs, 13,914,503,672 bytes) --    λ> length (ordenadosPorMaximo4 [[1..k] | k <- [1..10^4]]) --    10000 --    (7.77 secs, 13,914,183,776 bytes) | 
El código se encuentra en GitHub.