import Prelude hiding(Maybe(..), lookup) data Maybe a = Just a | Nothing deriving (Show) instance Monad Maybe where return x = Just x (Just x) >>= f = f x Nothing >>= _ = Nothing findSomething :: Maybe Int findSomething = return 3 findSomethingElse :: Int -> Maybe Int findSomethingElse x = return (x+5) lookup :: Int -> Int -> Maybe Int lookup x y = return (x*y) someFailure :: Maybe a someFailure = Nothing findThemAll :: Maybe Int findThemAll = do x <- findSomething y <- findSomethingElse x lookup x y findThemAllFail :: Maybe Int findThemAllFail = do x <- findSomething someFailure y <- findSomethingElse x lookup x y main = print findThemAll >> print findThemAllFail