[Haskell-cafe] Conversion between MonadPlus instances

Andrew Pimlott andrew at pimlott.net
Fri Jul 1 14:42:08 EDT 2005

On Fri, Jul 01, 2005 at 12:33:13PM +0200, Gracjan Polak wrote:
> Example: I have some function, that can return multiple results. 
> Currently I need only the first one, but in the spirit of NotJustMaybe, 
> I try to be as general as possible.
> If I code it like this:
> reduction :: (MonadPlus m) => [Rule] -> Expr -> m Expr
> reduction expr = do
>     rule <- rules
>     reduction rule expr
> Variable m gets unified with []. But I want m to stay as general as 
> possible here.
> This version works, but I somehow do not like the "smell" of it
> reduction expr = do
>     let listmonad = do
>         rule <- rules
>         reduction rule expr
>     msum (map return listmonad)
> Is there a better way how to "embed" MonadPlus in other "MonadPlus"?

It might smell better if you wrote it as

    reduction expr = do
        rule <- msum (map return rules)
        reduction rule expr

or made a separate function

    msumVals :: MonadPlus => [a] -> m a
    msumVals xs = msum (map return xs)

But I think you have a further problem, because the type you gave for
reduction does not match your definitions.  And if it did, I think you
would shortly run into another problem, involving infinite types.  Maybe
you're thinking along the lines of

    reduction rules expr = do
        rule <- msumVals rules
        rules' <- run rule
        reduction rules' expr

for some suitable function run?


More information about the Haskell-Cafe mailing list