.. _doandifthenelse:

Do And If Then Else
===================

.. extension:: DoAndIfThenElse
    :shortdesc: Allow semicolons in ``if`` expressions.

    :since: 7.0.1

    :status: Included in :extension:`GHC2024`, :extension:`GHC2021`, :extension:`Haskell2010`

    Allow semicolons in ``if`` expressions.

Normally, a conditional is written like this: ``if cond then expr1 else expr2``. With the extension
:extension:`DoAndIfThenElse`, semicolons are allowed before the ``then`` and also before the ``else``, allowing
``if cond; then expr1; else expr2``. (You can also include either semicolon on its own.)

Allowing semicolons in the middle of a conditional is useful in connection with layout-controlled
blocks, like ``do``\ -blocks. This is because GHC invisibly inserts a semicolon between each line of a
layout-controlled block. Accordingly, with :extension:`DoAndIfThenElse`, we can write code like this ::

  f mb x y = do
    b <- mb
    if b
    then x
    else y

Without :extension:`DoAndIfThenElse`, the ``then`` and ``else`` lines would have to be indented with respect
to the rest of the lines in the ``do``\ -block.
