If an array is what you need, use an Array
! This solution to this problem is even given in the linked docs, because you're actually just creating a histogram.
hist :: (Ix a, Num b) => (a,a) -> [a] -> Array a b hist bnds is = accumArray (+) 0 bnds [(i, 1) | i<-is, inRange bnds i]
count n xs = hist (1, n) xs
One subtlety is that you should probably use a strict version of (+)
to avoid building up a long chain of thunks.
{-# LANGUAGE BangPatterns #-}
plus :: Num a => a -> a -> a
plus !a !b = a + b