Reducción de consecutivos relacionados
Definir la función
reducida :: (a -> a -> Bool) -> [a] -> [a]
tal que (reducida r xs) obtenida elimando en xs las repeticiones de elementos consecutivos queverifican la relación r. Por ejemplo,
reducida (==) [4,4,2,1,1,1,2,5] == [4,2,1,2,5] reducida (<) [4,4,2,1,1,1,2,5] == [4,4,2,1,1,1] reducida (>=) [4,4,2,1,1,1,2,5] == [4,5] reducida (>) [4,4,2,1,1,1,2,5] == [4,4,5] reducida (/=) [4,4,2,1,1,1,2,5] == [4,4]
Soluciones
import Data.List (groupBy) -- 1ª solución reducida :: (a -> a -> Bool) -> [a] -> [a] reducida _ [] = [] reducida r (x:xs) = x : reducida r (dropWhile (r x) xs) -- 2ª solución reducida2 :: (a -> a -> Bool) -> [a] -> [a] reducida2 r = foldr aux [] where aux x xs = x : dropWhile (r x) xs -- 3ª solución reducida3 :: (a -> a -> Bool) -> [a] -> [a] reducida3 r xs = map head (groupBy r xs)