Если список содержит только целые числа, вы также можете использовать
import qualified Data.IntMap as I
countElems1 :: [Int] -> [(Int, Int)]
countElems1 = I.toList . foldr (\k -> I.insertWith (+) k 1) I.empty
(хотя не забудьте скомпилировать с оптимизацией, иначе это будет в 2 раза медленнее, чем метод group . sort
. При -O2
этонемного быстрее на 14%.)
Вы также можете использовать один из мультимножество пакетов , что делает функцию такой простой, как
import qualified Math.Combinatorics.Multiset as S
countElems4 = S.toCounts . S.fromList
но будучи менее эффективным.
Все вышеперечисленные решения игнорируют первоначальный порядок.