Maybe

data Maybe a = Nothing | Just a

instance Monad Maybe where
    return      =   Just
    fail        =   Nothing
    Nothing     >>= f = Nothing
    (Just x)    >>= f = f x

instance MonadPlus Maybe where
    mzero               = Nothing
    Nothing `mplus` x   = x
    x `mplus` _         = x
instance Functor Maybe where
    fmap f (Just x) = Just (f x)
    fmap f Nothing  = Nothing
instance Monad Maybe where
    return x      = Just x

    Nothing >>= f = Nothing
    Just x  >>= f = f x

    fail _        = Nothing