# Solution4.html

Jump to navigation
Jump to search

The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

```
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
```

If the compiler cannot guess which MonadPlus to use you will need to specify it when the function is called. So, `parent someSheep :: Maybe Sheep`

will use the Maybe monad and either `parent someSheep :: [] Sheep`

or `parent someSheep :: [Sheep]`

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):

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