Deniz Dogan wrote:
I (too) often find myself writing code such as this:

if something
  then putStrLn "howdy there!"
  else if somethingElse
          then putStrLn "howdy ho!"
          else ...

I recall reading some tutorial about how you can use the Maybe monad
if your code starts looking like this, but as you can see, that
doesn't really apply here. "something" and "somethingElse" are simply
booleans and each of them have different actions to take if either of
them is True.

So how do I make code like this prettier?

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

Obviously, this is nausiating. Surely we can do better somehow?

The above is a simple example. I might need to check file permissions, invoke external programs, parse files, all sorts of things. And it might matter which order the tests happen in. Later tests might use information gained during earlier tests. But the recurring pattern is "check this thing; if it passes, continue; if it fails, stop here and emit an error message". Can we abstract this somehow?

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

Reply via email to