Elementos más frecuentes
Definir la función
1 |
masFrecuentes :: Ord a => Int -> [a] -> [(Int,a)] |
tal que (masFrecuentes n xs) es la lista de los pares formados por los elementos de xs que aparecen más veces junto con el número de veces que aparecen. Por ejemplo,
1 2 3 4 5 6 |
ghci> masFrecuentes 2 "trianera" [(2,'r'),(2,'a')] ghci> masFrecuentes 2 "interdisciplinariedad" [(5,'i'),(3,'d')] ghci> masFrecuentes 3 (show (product [1..10000])) [(5803,'0'),(3416,'2'),(3341,'4')] |
Soluciones
1 2 3 4 5 |
import Data.List (group, sort) masFrecuentes :: Ord a => Int -> [a] -> [(Int,a)] masFrecuentes n = take n . reverse . sort . cuenta . group . sort where cuenta xss = [(length xs,head xs) | xs <- xss] |
Para que usar una clara lista por comprehension cuando uno puede liarla usando aplicativos :-P :
o (igual mas claro todavia)
Algunos comentarios sobre las funciones aplicativas que aún no se han estudiado en I1M2014.
En la primera definición se usa el operador (<*>). Su significado se explica con el siguiente ejemplo,
En general,
es equivalente a
El significado de (zip . map length <*> map head) se puede apreciar con el siguiente cálculo
En la segunda definición se ha usado el operador (<$>). Su significado se explica con el siguiente ejemplo,
También se ha usado el operador (,) para construir pares. Por ejemplo,
El significado de (map $ (,) <$> length <*> head) se puede apreciar con el siguiente cálculo
Un poco lioso pero quería intentarlo sin utilizar librerías extra.