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

1

17

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.

Nevis answered 7/5, 2011 at 12:2 Comment(0)
P
37

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
Pupa answered 7/5, 2011 at 12:30 Comment(1)
using when seems to be cleanerBozovich

© 2022 - 2024 — McMap. All rights reserved.