[Haskell-cafe] Nested tests [Code walking off the right edge of the
screen]
Andrew Coppin
andrewcoppin at btinternet.com
Sun Jun 21 05:52:22 EDT 2009
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?
More information about the Haskell-Cafe
mailing list