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



_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to