Compactación de listas
Definir la función
compactada :: [Maybe Int] -> [Int]
tal que (compacta xs) es la lista obtenida al compactar xs con las siguientes reglas:
- se eliminan los elementos Nothing;
- si dos elementos consecutivos tienen el mismo valor, se sustituyen por el sucesor de su valor y
- los restantes elementos no se cambian.
Por ejemplo,
λ> compactada [Just 1,Nothing,Just 1,Just 4,Just 4,Just 3,Just 6] [2,5,3,6] λ> compactada [Just 1,Nothing,Just 1,Just 1,Just 4,Just 3,Just 6] [2,1,4,3,6] λ> compactada [Just 1,Nothing,Just 1,Just 1,Just 4,Just 4,Just 6] [2,1,5,6] λ> compactada [Just 1,Nothing,Just 1,Just 1,Just 4,Just 3,Just 4] [2,1,4,3,4] λ> compactada [Just 1,Nothing,Just 1,Just 2,Just 4,Just 3,Just 4] [2,2,4,3,4]
Soluciones
-- 1ª definición compactada1 :: [Maybe Int] -> [Int] compactada1 xs = aux (valores xs) where aux (x:y:xs) | x == y = x+1 : aux xs | otherwise = x : aux (y:xs) aux xs = xs -- (valores vs) es la lista de los valores de vs. Por ejemplo, -- λ> valores [Just 1,Nothing,Just 1,Nothing,Just 3,Just 6] -- [1,1,3,6] valores :: [Maybe Int] -> [Int] valores xs = [x | Just x <- xs] -- 2ª definición de valores (por recursión): valores2 :: [Maybe Int] -> [Int] valores2 [] = [] valores2 ((Just v):vs) = v: valores2 vs valores2 (Nothing:vs) = valores2 vs