Branching conditionals can be written straightforwardly using the
else syntax in Haskell. Note that all three are keywords and that each branch of an
else expression must return the same type.
import Control.Monad (when)
The condition in the
if clause must evaluate to a Boolean. Here,
even evaluates to
True when its argument is an even number. A conditional expression that starts with
if must have both a
then and an
else branch is not optional, and you must include the word
= main do if (even 7) then putStrLn "7 is even" else putStrLn "7 is odd"
You can write the equivalent of an
else-less conditional using
when instead of
if. Note that
when isn’t available by default but is imported from
8 `mod` 4 == 0) $ when (putStrLn "8 is divisible by 4"
You can use
let to preface conditionals with statements. Variables declared in the
let statement are available in all branches, but not outside of this expression.
let num = 9 in if num < 0 then putStrLn (show num ++ " is negative") else if num < 10 then putStrLn (show num ++ " has 1 digit") else putStrLn (show num ++ " has multiple digits")
You can also use pattern guards instead of nested
if expressions. Each branch is indicated with a pipe
case declares the value of the variable.
case 19 of num| num < 0 -> putStrLn (show num ++ " is negative") | num < 10 -> putStrLn (show num ++ " has 1 digit")
In case the other branches were
False and thus did not return their values, an
otherwise branch ensure all cases are covered and prevents a runtime error.
Parentheses are not required around expressions in the
if clause or either of the branches, but we sometimes include them for clarity.
| otherwise -> putStrLn (show num ++ " has multiple digits")
Running the program gives us no unpleasant surprises.
$ runhaskell if-else.hs 7 is odd 8 is divisible by 4 9 has 1 digit19 has multiple digits