Agrupamiento según valores
Definir la función
1 |
agrupa :: Ord c => (a -> c) -> [a] -> Map c [a] |
tal que (agrupa f xs) es el diccionario obtenido agrupando los elementos de xs según sus valores mediante la función f. Por ejemplo,
1 2 3 4 5 6 |
ghci> agrupa length ["hoy", "ayer", "ana", "cosa"] fromList [(3,["hoy","ana"]),(4,["ayer","cosa"])] ghci> agrupa head ["claro", "ayer", "ana", "cosa"] fromList [('a',["ayer","ana"]),('c',["claro","cosa"])] ghci> agrupa length (words "suerte en el examen") fromList [(2,["en","el"]),(6,["suerte","examen"])] |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 |
import qualified Data.List as L import Data.Map -- 1ª definición (por recursión) agrupa1 :: Ord c => (a -> c) -> [a] -> Map c [a] agrupa1 _ [] = empty agrupa1 f (x:xs) = insertWith (++) (f x) [x] (agrupa1 f xs) -- 2ª definición (por plegado) agrupa2 :: Ord c => (a -> c) -> [a] -> Map c [a] agrupa2 f = L.foldr (\x -> insertWith (++) (f x) [x]) empty |
Es extraño, pero
fromListWith
me cambia el orden de los valores del mapa.Para ajustarse a los ejemplos, es necesario invertir la lista: