Hi Tim,
I am not too deep into category theory. But the Data.Monoid class defines the identity as mempty. And the binary operation as mappend. So that would be:
maybePlus = maybe mempty id $ liftM2 (mappend) x y
You only have to define Num as Monoid, because there are more monoids possible. (Multiplication, addition etc).
That would look something like this:
instance (Num a) => Monoid a where ...
Have a look at the monoid class: http://haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Monoid.html
Greets,
Edgar
On 13 Jul 2010, at 15:31, edgar klerks wrote:Aah thanks Edgar - I'd meant to ask about this specifically actually, as addition is a monoid over the real numbers and therefore has an identity element, I was wondering if there was an easier way to generalise it to cope with arguments in the Maybe monad. As far as I can see, this is precisely what you describe above. Therefore, would I be right in saying that your approach can be generalised to any function which forms a monoid over a specific type?
> You can use maybe from Data.Maybe: b -> (a -> b) -> Maybe a -> b
>
> to create your maybe plus function:
>
> maybePlus x y = maybe 0 id $ liftM2 (+) x y
>
> That is somewhat cleaner.
I'm imagining something like:
maybeMonoid :: (a -> a -> a) -> a -> (Maybe a -> Maybe a -> a)
maybeMonoid f identity = maybe identity id $ liftM2 f
Thanks for the feedback!
Cheers,
Tim