6.2.15. Multi-way if-expressions — Glasgow Haskell Compiler 9.10.0.20240413 User's Guide

# 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 = ...