do
-notation
Conditionals and Ticket |
|
||
---|---|---|---|
Dependencies | |||
Related | NondecreasingIndentation |
Compiler support
GHC | full (no flag) |
---|---|
nhc98 | full (no flag) |
Hugs | full (no flag) |
UHC | full (no flag) |
JHC | full (no flag) |
LHC | full (no flag) |
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
else
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.
Proposal
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, GHC and Hugs, and so far it has not caused any problems.
The second optional semicolon is the important one. The first one just adds a little more convenience.
Possible addition (this addition is not part of the proposal as accepted for Haskell 2010): Jon Fairbairn suggests that if an optional semicolon is added before then
, it would be consistent to also add one before of
in case
expressions, allowing:
do case whatever
of
blah -> bluh
blah' -> bluh'
References
- Conditionals in the Haskell 98 Report
- Somewhat related to NondecreasingIndentation
Pros
- 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.
Cons
-
It has been pointed out that improved error reporting could alleviate this issue to some extent, without any language change. An alternative might thus be to add a section to the report with recommendations concerning "best practices" for reporting errors related to this issue and other that are known to cause confusion.
-
People might actually write these optional semicolons literally in their code, thus relying on this hack, making it harder to fix the problem in a better way later.