[Haskell-beginners] Averaging a string of numbers

goodman.m.w at gmail.com goodman.m.w at gmail.com
Sun Dec 11 22:37:37 CET 2011


Thanks for the reply, Brent!

I have a question about the "later" I referred to:

On Sun, Dec 11, 2011 at 7:19 AM, Brent Yorgey <byorgey at seas.upenn.edu> wrote:
> On Sat, Dec 10, 2011 at 07:21:58PM -0800, goodman.m.w at gmail.com wrote:
>> ... later I will add support for other statistics, like
>> max, min, sum, prod, etc.

Specifically, how max and min work with the Monoid implementation.

> Let's add a Monoid instance for Stats, which specifies how two Stats
> objects should be combined:
>
>  instance Monoid Stats where
>    mempty = Stats 0 0
>    mappend (Stats sm1 len1) (Stats sm2 len2) = Stats (sm1 + sm2) (len1 + len2)

Monoids are new to me, but I just read a bit about them in Real World
Haskell, and what you have makes sense. mempty is the identity
function of Stats, and mappend is the associative binary operator. And
thus far these properties hold true for the definition of Stats. If I
add entries for min and max, it seems like it could still be valid. Of
course, for an empty list of numbers, whereas sum can be 0.0 and len
can be 0, there is no corresponding value for max and min, so I make
them Maybe Double with an initial value of Nothing, and modify your
code as follows:

data Stats = Stats { sm :: Double, mn, mx :: Maybe Double, len :: Int }
             deriving Show

instance Monoid Stats where
  mempty = Stats 0.0 Nothing Nothing 0
  mappend (Stats sm1 mn1 mx1 len1) (Stats sm2 mn2 mx2 len2)
         = Stats (sm1 + sm2) (min mn1 mn2) (max mx1 mx2) (len1 + len2)

mkStats x = Stats x (Just x) (Just x) 1

This compiles and works for max, but min does not work. I tested in ghci, and:

Prelude> min (Just 0.1) (Nothing)
Nothing
Prelude> max (Just 0.1) (Nothing)
Just 0.1

Which explains the problem. Any idea for the solution?

-- 
-Michael Wayne Goodman



More information about the Beginners mailing list