count :: Eq a => a -> [a] -> Int
count n [] = 0
count n (x:xs) | n == x = 1 + count n xs
| otherwise = count n xs
rmdups :: Eq a => [a] -> [a]
rmdups [ ] = [ ]
rmdups (x:xs) = x : rmdups (filter(/= x) xs)
using the 2 functions, a third needs to be created, called frequency:
it should count how many times each distinct value in a list occurs in that list. for example : frequency “ababc”, should return [(3,’a’),(2,’b’),(1,’c’)].
the layout for frequency is :
frequency :: Eq a => [a] -> [(Int, a)]
P.s rmdups, removes duplicates from list, so rmdups “aaabc” = abc
and count 2 [1,2,2,2,3] = 3.
so far i have:
frequency :: Eq a => [a] -> [(Int, a)]
frequency [] = []
frequency (x:xs) = (count x:xs, x) : frequency (rmdups xs)
but this is partly there, (wrong). thanks
or, with a list comprehension,
is the shortest way to define it using your
countandrmdups. If you need it sorted according to frequency (descending) as in your example,using
sortByfromData.ListandcomparingfromData.Ord.If all you have is an
Eqconstraint, you cannot gain much efficiency, but if you only need it for types inOrd, you can get a much more efficient implementation using e.g.Data.SetorData.Map.