Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Haskell - "How can I use "if" statement in "do" block properly? [duplicate]

Possible Duplicate:
Haskell “do nothing” IO, or if without else

Something got wrong in these "easy" lines ...

action = do
    isdir <- doesDirectoryExist path  -- check if directory exists.
    if(not isdir)                     
        then do handleWrong
    doOtherActions                    -- compiling ERROR here.

GHCi will complaint about identifiers , or do not exec the last line action after I add else do .

I think exception handling may work, but is it necessary in such common "check and do something" statements ?

Thanks.

like image 580
snowmantw Avatar asked May 07 '11 12:05

snowmantw


1 Answers

if in Haskell must always have a then and an else. So this will work:

action = do
    isdir <- doesDirectoryExist path
    if not isdir
        then handleWrong
        else return ()     -- i.e. do nothing
    doOtherActions

Equivalently, you can use when from Control.Monad:

action = do
    isdir <- doesDirectoryExist path
    when (not isdir) handleWrong
    doOtherActions

Control.Monad also has unless:

action = do
    isdir <- doesDirectoryExist path
    unless isdir handleWrong
    doOtherActions

Note that when you tried

action = do
    isdir <- doesDirectoryExist path
    if(not isdir)
        then do handleWrong
        else do
    doOtherActions

it was parsed as

action = do
    isdir <- doesDirectoryExist path
    if(not isdir)
        then do handleWrong
        else do doOtherActions
like image 105
dave4420 Avatar answered Sep 18 '22 04:09

dave4420