[Haskell-cafe] Combining computations

Tillmann Rendel rendel at cs.au.dk
Sun May 3 18:02:09 EDT 2009

Claus Reinke wrote:
>>  mplus' :: MonadPlus m => Maybe a -> m a -> m a
>>  mplus' m l = maybeToMonad m `mplus` l
>>  maybeToMonad :: Monad m => Maybe a -> m a
>>  maybeToMonad = maybe (fail "Nothing") return
>> In general, however, this operation can't be done.  For example,
>> how would you write:
>>  mplus' :: IO a -> [a] -> [a]
> Perhaps the question should be: is there an interesting structure
> that would allow us to capture when this kind of merging Monads
> is possible? 

For me, it seems that Foldable is the other side of Alternative. A 
functor F supports Alternative if (F a) supports a monoidal structure 
for the construction of values, and it supports Foldable if (F a) 
supports a monoidal structure for the decomposition of values. That 
means that we can give a translation from every Foldable functor to 
every Alternative functor as follows:

   foldable2alternative = foldr (<|>) empty . fmap pure


More information about the Haskell-Cafe mailing list