On 2 Apr 2008, at 16:20, Loup Vaillant wrote:
class AdditiveSemiMonoid a where
  (+) :: a -> a -> a

Err, why *semi* monoid? Plain "monoid" would not be accurate?

I found an example where it is crucial that the monoid has a unit:

When given a monoid m, then one can also define an m-algebra, by giving a structure map (works in 'hugs -98'):
  class Monad m => MAlgebra m a where
    smap :: m a -> a

Now, the set of lists on a set A is just the free monoid with base A; the list monad identifies the free monoids, i.e., the lists. So this then gives Haskell interpretation
  class Monoid a where
  unit  :: a
  (***) :: a -> a -> a

instance Monoid a => MAlgebra [] a where
  smap [] = unit
  smap (x:xs) = x *** smap xs
Here, I use (***) to not clash with the Prelude (*).

But the function "product" here shows up as the structure map of a multiplicative monoid. Similarly, "sum" is the structure map of the additive monoids. And (++) is just the monoid multiplication of the free monoids.

  Hans


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to