Wenn die Liste nur ganze Zahlen enthält, auch wenn
import qualified Data.IntMap as I
countElems1 :: [Int] -> [(Int, Int)]
countElems1 = I.toList . foldr (\k -> I.insertWith (+) k 1) I.empty
(Denken Sie daran, mit der Optimierung zu kompilieren verwenden könnte, sonst wird dies 2x langsamer als die group . sort
Methode. Mit -O2
es ist etwas schneller um 14%.)
Sie auch eine der multisetpackages verwenden könnte, die die Funktion so einfach wie
macht
import qualified Math.Combinatorics.Multiset as S
countElems4 = S.toCounts . S.fromList
aber weniger effizient sein.
Alle oben genannten Lösungen ignorieren die ursprüngliche Reihenfolge.
ist wichtig, um? Wenn ja, wie lautet die Bestellung? Reihenfolge des ersten Auftretens? – sepp2k