import Data.List (inits, nub)
-- 1ª definición (por comprensión)
maximos1 :: Ord a => [a] -> [a]
maximos1 xs =
[x | (ys,x) <- zip (inits xs) xs, all (<x) ys]
-- 2ª definición (por recursión)
maximos2 :: Ord a => [a] -> [a]
maximos2 [] = []
maximos2 (x:xs) = x : maximos2 (filter (>x) xs)
-- 3ª definición (por recursión con acumulador)
maximos3 :: Ord a => [a] -> [a]
maximos3 [] = []
maximos3 (x:xs) = aux xs [x] x
where aux [] zs _ = reverse zs
aux (y:ys) zs m | y > m = aux ys (y:zs) y
| otherwise = aux ys zs m
-- 4ª definición (con scanl1):
maximos4 :: Ord a => [a] -> [a]
maximos4 = nub . scanl1 max
-- Comparación de eficiencia
-- ghci> maximos1 (concat (replicate (10^3) "adxbcde") ++ "yz")
-- "adxyz"
-- (5.82 secs, 2859603952 bytes)
-- ghci> maximos2 (concat (replicate (10^3) "adxbcde") ++ "yz")
-- "adxyz"
-- (0.02 secs, 5879664 bytes)
-- ghci> maximos3 (concat (replicate (10^3) "adxbcde") ++ "yz")
-- "adxyz"
-- (0.03 secs, 4153680 bytes)
-- ghci> maximos4 (concat (replicate (10^3) "adxbcde") ++ "yz")
-- "adxyz"
-- (0.02 secs, 4163296 bytes)
--
-- ghci> maximos2 (concat (replicate (10^6) "adxbcde") ++ "yz")
-- "adxyz"
-- (3.64 secs, 1314485320 bytes)
-- ghci> maximos3 (concat (replicate (10^6) "adxbcde") ++ "yz")
-- "adxyz"
-- (6.59 secs, 1706434544 bytes)
-- ghci> maximos4 (concat (replicate (10^6) "adxbcde") ++ "yz")
-- "adxyz"
-- (0.89 secs, 1594567000 bytes)
--
-- ghci> length (maximos2 [1..10^4])
-- 10000
-- (17.34 secs, 4302913816 bytes)
-- ghci> length (maximos3 [1..10^4])
-- 10000
-- (0.03 secs, 6602488 bytes)
-- ghci> length (maximos4 [1..10^4])
-- 10000
-- (1.37 secs, 6820408 bytes)