Stability  experimental 

Maintainer  Alexey Khudyakov <alexey.skladnoy@gmail.com> 
 class Monoid m => StatMonoid m a where
 pappend :: a > m > m
 evalStatistic :: (Foldable d, StatMonoid m a) => d a > m
 newtype Count a = Count {
 calcCount :: a
 data Mean = Mean {
 calcMean :: Double
 calcCountMean :: Int
Documentation
class Monoid m => StatMonoid m a whereSource
Monoid which corresponds to some stattics. In order to do so it
must be commutative. In many cases it's not practical to
construct monoids for each element so papennd
was added.
First parameter of type class is monoidal accumulator. Second is
type of element over which statistic is calculated.
Statistic could be calculated with fold over sample. Since
accumulator is Monoid
such fold could be easily parralelized.
Instance must satisfy following law:
pappend x (pappend y mempty) == pappend x mempty `mappend` pappend y mempty mappend x y == mappend y x
Add one element to monoid accumulator. P stands for point in analogy for Pointed.
StatMonoid Mean Double  
StatMonoid Mean Float  
StatMonoid Mean Int  
StatMonoid Mean Int8  
StatMonoid Mean Int16  
StatMonoid Mean Int32  
StatMonoid Mean Int64  
StatMonoid Mean Integer  
StatMonoid Mean Word  
StatMonoid Mean Word8  
StatMonoid Mean Word16  
StatMonoid Mean Word32  
StatMonoid Mean Word64  
Integral a => StatMonoid (Count a) b  
(StatMonoid a x, StatMonoid b x) => StatMonoid (TwoStats a b) x 
evalStatistic :: (Foldable d, StatMonoid m a) => d a > mSource
Calculate statistic over Foldable
. It's implemented in terms of
foldl'.
Statistic monoids
Simplest statistics. Number of elements in the sample
Mean of sample. Samples of Double,Float and bui;tin integral types are supported
Numeric stability of mappend
is not proven.
Mean  

Additional information
Statistic is function of a sample which does not depend on order of elements in a sample. For each statistics corresponding monoid could be constructed:
f :: [A] > B data F = F [A] evalF (F xs) = f xs instance Monoid F here mempty = F [] (F a) `mappend` (F b) = F (a ++ b)
This indeed proves that monoid could be constructed. Monoid above is completely impractical. It runs in O(n) space. However for some statistics monoids which runs in O(1) space could be implemented. For example mean.
On the other hand some statistics could not be implemented in such way. For example calculation of median require O(n) space. Variance could be implemented in O(1) but such implementation won't be numerically stable.