Version 5 (modified by ross@…, 14 years ago) (diff)

Conditionals and do-notation

Brief Explanation

I have lost count of how many times people (including very experienced programmers) have approached me wondering why on earth code like the following fails to parse:

foo :: Monad m => Bool -> m Int
foo x = do
    if x then
        return 1
        return 2

When I explain that they have to indent the else at least one more step, they invariably stare at me in disbelief and vow to henceforth stay far away from languages where layout has semantic significance. It can actually be somewhat embarassing, and it certainly can put beginners off.

Strictly speaking, the issue is not tied to the do-notation, but that is where it (almost?) always shows up.


Change the syntax for conditionals to

exp → if exp1 [;] then exp2 [;] else exp3

i.e., add optional semicolons before then and else, making the above example legal. This has been recently added to jhc and GHC, and so far, it has not caused any problems.





  • Would address a layout issue that manifestly trips up a lot of people, and many experienced Haskell programmers find very annoying.
  • Trivial to implement
  • Independent of the layout rule.