Quantcast

MonadPlus m => Maybe a -> m a

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

MonadPlus m => Maybe a -> m a

Thiago Negri
I'm solving this exercise:
http://www.haskell.org/haskellwiki/All_About_Monads#Exercise_4:_Using_the_Monad_class_constraint

I'm missing a function to transform a Maybe a into a MonadPlus m => m a.
I did search on Hoogle with no luck.

There is no standard definition for the "g" function I'm defining?

My take on the exercise:

data Sheep = Sheep {
        mother :: Maybe Sheep,
        father :: Maybe Sheep,
        name :: String }

instance Show Sheep where -- for testing
        show = name

g :: (MonadPlus m) => Maybe a -> m a
g Nothing = mzero
g (Just a) = return a

mother' :: (MonadPlus m) => Sheep -> m Sheep
mother' = g . mother

father' :: (MonadPlus m) => Sheep -> m Sheep
father' = g . father

parent'' :: (MonadPlus m) => Sheep -> m Sheep
parent'' s = mother' s `mplus` father' s

grandparent'' :: (MonadPlus m) => Sheep -> m Sheep
grandparent'' s = parent'' s >>= parent''

_______________________________________________
Haskell-Cafe mailing list
[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: MonadPlus m => Maybe a -> m a

Alexander Solla


On Sat, Jul 28, 2012 at 8:00 AM, Thiago Negri <[hidden email]> wrote:
I'm solving this exercise:
http://www.haskell.org/haskellwiki/All_About_Monads#Exercise_4:_Using_the_Monad_class_constraint

I'm missing a function to transform a Maybe a into a MonadPlus m => m a.
I did search on Hoogle with no luck.

There is no standard definition for the "g" function I'm defining? 

g :: (MonadPlus m) => Maybe a -> m a
g Nothing = mzero
g (Just a) = return a

I doubt there is a "standard" named function for this, since conversions between monads are typically not "unique" and there are lots and lots of pairs of monads you can convert between.

You can define g in terms of Data.Maybe.maybe as:

g = maybe mzero return

_______________________________________________
Haskell-Cafe mailing list
[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe
Loading...