[Haskell-cafe] Combining computations

Daniel Fischer daniel.is.fischer at web.de
Sun May 3 07:19:30 EDT 2009


Am Sonntag 03 Mai 2009 05:26:22 schrieb michael rice:
> I posted something similar about an hour ago but it seems to have gotten
> lost. Very strange.
>
> I've read that Monads can combine computations. Can a Maybe monad be
> combined with a List monad such that
>
> Nothing `mplus` [] ==> []
> Just 1 `mplus` [] ==> [1]

Not directly, the type of mplus is

mplus :: MonadPlus m => m a -> m a -> m a

, so the monad has to be the same for both arguments. For [] and Maybe, you can use 
maybeToList and listToMaybe to convert one into the other:

Prelude Data.Maybe Control.Monad> maybeToList Nothing
[]
Prelude Data.Maybe Control.Monad> maybeToList (Just 1)
[1]
Prelude Data.Maybe Control.Monad> maybeToList Nothing `mplus` [1]
[1]
Prelude Data.Maybe Control.Monad> maybeToList (Just 1) `mplus` []
[1]
Prelude Data.Maybe Control.Monad> Nothing `mplus` listToMaybe [1]
Just 1
Prelude Data.Maybe Control.Monad> Nothing `mplus` listToMaybe [1,2,3]
Just 1

, for certain other combinations, you can also have a meaningful conversion from one monad 
to another (e.g. 
stateToStateT :: Monad m => State s a -> StateT s m a
stateToStateT comp = StateT (return . runState comp)
) and employ the technique to combine them, but it's of limited use.

A monad allows you to combine computations of 'similar' type (for some fuzzy meaning of 
similar), using (>>=), (>>) to combine them sequentially and perhaps mplus to combine them 
'in parallel'.

>
> If not, can someone supply a simple example of combining computations?
>
> Michael



More information about the Haskell-Cafe mailing list