# Solution4.html

### From HaskellWiki

(Difference between revisions)

(Another definition of grandparent.) |
(Disclaimer for the alternative solution) |
||

Line 16: | Line 16: | ||

If the compiler cannot guess which MonadPlus to use you will need to specify it when the function is called. So, <hask>parent someSheep :: Maybe Sheep</hask> will use the Maybe monad and either <hask>parent someSheep :: [] Sheep</hask> or <hask>parent someSheep :: [Sheep]</hask> will use the list monad. | If the compiler cannot guess which MonadPlus to use you will need to specify it when the function is called. So, <hask>parent someSheep :: Maybe Sheep</hask> will use the Maybe monad and either <hask>parent someSheep :: [] Sheep</hask> or <hask>parent someSheep :: [Sheep]</hask> will use the list monad. | ||

− | + | ||

+ | This next alternative grandparent function only works in the case of the List monad (see exercise 5.2 for why the Maybe monad does not work): | ||

<haskell> | <haskell> | ||

grandparent :: (MonadPlus m) => Sheep -> m Sheep | grandparent :: (MonadPlus m) => Sheep -> m Sheep | ||

grandparent s = parent s >>= parent | grandparent s = parent s >>= parent | ||

</haskell> | </haskell> |

## Latest revision as of 17:56, 10 June 2013

parent :: MonadPlus m => Sheep -> m Sheep parent s = (toMonad (father s)) `mplus` (toMonad (mother s)) grandparent :: MonadPlus m => Sheep -> m Sheep grandparent s = (toMonad (parentalGrandfather s)) `mplus` (toMonad (parentalGrandmother s)) `mplus` (toMonad (maternalGrandfather s)) `mplus` (toMonad (maternalGrandmother s)) toMonad :: MonadPlus m => Maybe a -> m a toMonad Nothing = mzero toMonad (Just s) = return s

parent someSheep :: Maybe Sheep

parent someSheep :: [] Sheep

parent someSheep :: [Sheep]

This next alternative grandparent function only works in the case of the List monad (see exercise 5.2 for why the Maybe monad does not work):

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