6.2.15. Multi-way if-expressions¶
-
MultiWayIf
¶ Since: 7.6.1 Allow the use of multi-way-
if
syntax.
With MultiWayIf
extension GHC accepts conditional expressions with
multiple branches:
if | guard1 -> expr1
| ...
| guardN -> exprN
which is roughly equivalent to
case () of
_ | guard1 -> expr1
...
_ | guardN -> exprN
Multi-way if expressions introduce a new layout context. So the example above is equivalent to:
if { | guard1 -> expr1
; | ...
; | guardN -> exprN
}
The following behaves as expected:
if | guard1 -> if | guard2 -> expr2
| guard3 -> expr3
| guard4 -> expr4
because layout translates it as
if { | guard1 -> if { | guard2 -> expr2
; | guard3 -> expr3
}
; | guard4 -> expr4
}
Layout with multi-way if works in the same way as other layout contexts, except that the semi-colons between guards in a multi-way if are optional. So it is not necessary to line up all the guards at the same column; this is consistent with the way guards work in function definitions and case expressions.
Note that multi-way if supports guards other than boolean conditions:
if | parseNumbers settings
, Just (exponent, mantissa) <- decomposeNumber str
, let (integralPart, fractionPart) = parse mantissa
, integralPart >= 0 -> ...
| otherwise -> ...