
On Jun 21, 2009, at 11:52 AM, Andrew Coppin wrote:
In a similar vein:
d1x <- doesDirectoryExist d1 if d1x then do f1x <- doesFileExist (d1 > f1) if f1x then do d2x <- doesDirectoryExist d2 if d2x then do f2x <- doesFileExist (d2 > f2) if f2x then do_stuff d1 d2 f1 f2 else hPutStrLn stderr $ "File " ++ f2 ++ " not found." else hPutStrLn stderr $ "Directory " ++ d2 ++ " not found." else hPutStrLn stderr $ "File " ++ f1 ++ " not found." else hPutStrLn stderr $ "Directory " ++ d1 ++ " not found."
using Control.Monad.Error: either (hPutStrLn stderr) return =<< runErrorT $ do d1x <- lift $ doesDirectoryExist d1 unless d1x $ fail "Directory " ++ d1 ++ " not found." f1x <- lift $ doesFileExist (d1 > f1) unless f1x $ fail "File " ++ f1 ++ " not found." d2x <- lift $ doesDirectoryExist d2 unless d2x $ fail "Directory " ++ d2 ++ " not found." f2x <- lift $ doesFileExist (d2 > f2) unless f2x $ fail "File " ++ f2 ++ " not found." lift $ doStuff d1 d2 f1 f2 When using failUnless boolAction message = lift boolAction >>= (`unless`fail message) the code becomes either (hPutStrLn stderr) return =<< runErrorT $ do failUnless (doesDirectoryExist d1) $ "Directory " ++ d1 ++ " not found." failUnless (doesFileExist (d1 > f1)) $ "File " ++ f1 ++ " not found." failUnless (doesDirectoryExist d2) $ "Directory " ++ d2 ++ " not found." failUnless (doesFileExist (d2 > f2)) $ "File " ++ f2 ++ " not found." lift $ doStuff d1 d2 f1 f2 It's similar to Claus's proposal to use MaybeT with additional support for error messages. Sebastian -- Underestimating the novelty of the future is a time-honored tradition. (D.G.)