looking for data structure advice

Conor McBride c.t.mcbride at durham.ac.uk
Mon Dec 15 14:08:03 EST 2003


Hi

David Roundy wrote:
> 
> On Mon, Dec 15, 2003 at 08:55:10AM +0000, Graham Klyne wrote:
> > I apologize... my question was unclear.
> >
> > It was not the standard MonadPlus class and functions that I was asking
> > about, but the specific instance for Maybe (i.e. or_maybe).  As it happens,
> > a couple of times in the past couple of weeks, I might have used such a
> > function if it were available in the standard libraries.
> 
> My or_maybe is just defined as
> 
> or_maybe (Just e) _ = Just e
> or_maybe Nothing f = f

I've always been a little bothered by the MonadPlus class: zero and plus
are associated (no pun intended) in my mind with monoidal structure.
Is there more to MonadPlus than a clumsy workaround for the lack of
quantified constraints?

If we could have quantified constraints, e.g.

  (Monad m, forall x. Monoid (m x))

wouldn't that be better than having Monad-specific monoids?

Of course, we can always kludge

  class MakesMonoid f where
    makesZero :: f x
    makesPlus :: f x -> f x -> f x

  instance MakesMonoid f => Monoid (f x) where
    mempty = makesZero
    mappend = makesPlus

but that causes serious restrictions on the other monoids we can
declare.

One useful thing about monoids is that they can be lifted pointwise
through product-like structures

  instance (Monoid x,Monoid y) => Monoid (x,y)

  instance Monoid t => Monoid (s -> t)
     -- note this conflicts with the more usual but (I claim)
     -- less useful Monoid (a -> a)

The latter gives us higher-order combinators for the price of
first-order operators. For example, given the `or_maybe'
monoid, we get for free the operation which prioritizes two
partial functions, trying the second only if the first fails.

  mappend :: (s -> Maybe t) -> (s -> Maybe t) -> (s -> Maybe t)

You'd also be amazed how useful the monoid IO () can be...

So I guess this is yet another plea for universally quantified
constraints. Is there a problem with them? I don't see why
(forall x. Monoid (m x)) is harder to check than
(Monoid (m FreshName)). Of course, the next thing after
quantified constraints is constrained constraints, and a big
chunk of lambda-Prolog appearing as one of Haskell's growing
collection of heterogeneous compile-time programming languages.

What a big can of tasty worms...

Cheers

Conor


More information about the Haskell-Cafe mailing list