import Control.Monad import Control.Applicative safeDiv :: (Monad m, Alternative m) => Int -> Int -> m Int safeDiv x y = do guard (y /= 0) pure (x `div` y) main :: IO () main = do print $ safeDiv @Maybe 1 0 print $ safeDiv @[] 1 0 -- print =<< safeDiv @IO 1 0 -- guard throws an error in IO