Skip to content

Instantly share code, notes, and snippets.

@cschneid
Created March 19, 2015 16:23
Show Gist options
  • Select an option

  • Save cschneid/eda4e43dd16461efae03 to your computer and use it in GitHub Desktop.

Select an option

Save cschneid/eda4e43dd16461efae03 to your computer and use it in GitHub Desktop.
module Main where
import Data.Monoid
data Average a = Average { sum :: a, count :: a } deriving (Show)
instance (Fractional a) => Monoid (Average a) where
mempty = Average (fromIntegral 0) (fromIntegral 0)
mappend (Average s1 c1) (Average s2 c2) = Average (s1 + s2) (c1 + c2)
-- Assuems count 1
mkAvg :: (Fractional a) => a -> Average a
mkAvg a = Average a 1
average :: (Eq a, Fractional a) => Average a -> a
average (Average sum 0) = error "Divide by zero, bad!"
average (Average sum count) = sum / count
main :: IO ()
main = do
let avg = mempty :: Average Float
let avg2 = avg <> (mkAvg 1)
let avg3 = avg2 <> (mkAvg 3)
print avg3
print $ average avg3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment