Haskellのdoの中のif式のインデント

Haskellについて調べていたら、do の中の if 式の then と else は if よりもインデントを深くする必要があるという情報があった。手元で試す限り、if, then, elseを揃えても特にエラーにならない。仕様が変わったのだろうか。もしかしたらと思い、-Wall をつけるも警告などは表示されなかった。

試したコード:

main :: IO ()
main = do if True
          then putStrLn "true"
          else putStrLn "false"

実行結果です。

% ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.4.1
% runghc -Wall a.hs
true

調べると、以下のページを見つけました。

doの中のif - あどけない話

上記ページのPDFを読むと、なぜ「doの中のif」なのかが分かりやすく書かれてあります。doの中で、if, then, elseのインデントを揃えてても問題なく動くのは、ifを3つの式から構成されるものとして扱うことにしたためらしい。ひとまずは、何が問題になっているかを把握することが出来てよかった。