GHCとHugsのdo式とif式に関するインデントの違い

まず,以下のコードはインデントが正しくない.

main = do if True
          then putStrLn "hoge"
          else putStrLn "fuga"

http://haskell.g.hatena.ne.jp/muscovyduck/20060817 などでも間違ってると書いてある.しかし,なぜかHugsでは動く.GHCiではインデントが間違っている,と怒られる.多分Hugsのバグ.

$ cat main.hs
main = do if True
          then putStrLn "hoge"
          else putStrLn "fuga"
$ hugs main.hs
__   __ __  __  ____   ___      _________________________________________
||   || ||  || ||  || ||__      Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__||  __||     Copyright (c) 1994-2005
||---||         ___||           World Wide Web: http://haskell.org/hugs
||   ||                         Bugs: http://hackage.haskell.org/trac/hugs
||   || Version: September 2006 _________________________________________

Haskell 98 mode: Restart with command line option -98 to enable extensions

Type :? for help
Main> main
hoge

Main> [Leaving Hugs]
takeuchi@ubuntu:~/Dropbox/prohass/if$ ghci main.hs
GHCi, version 6.12.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( main.hs, interpreted )

main.hs:2:10: parse error (possibly incorrect indentation)
Failed, modules loaded: none.

2chでも同様の話が出ている. http://www.tom.sfc.keio.ac.jp/~sakai/2ch/1162902266.html

108 名前:105 メール:sage 投稿日:2006/11/26(日) 07:23:22
    もうひとつ疑問があります。

    次のコードが、hugsでは受け付けられるのに、ghci・ghcでは、
    hoge.hs:3:10: parse error (possibly incorrect indentation)
    などと、エラーになります。
    haskellの言語仕様上、下記の記述は許されないということでしょうか?

    main = do if True then putStrLn "t"
    **********else putStrLn "f"

    但し、半角スペースを記号"*"で置き換えています。
109 名前:デフォルトの名無しさん メール:sage 投稿日:2006/11/26(日) 09:32:45
    >>108
    仕様上正しいかどうかは知らんけど、もう一個スペース入れればghcで受け付けるようになる。
    もしくは、この例ではdoは必要ないから外してしまうとghcでもOK。

    ghcではdo構文の中ではthenとかelseはifの開始位置よりも右から始めないとダメって事になってるのかも。 
     
114 名前:デフォルトの名無しさん メール:sage 投稿日:2006/11/26(日) 13:16:47
    >>108
    if..then..elseは単なる式であって、doの文にするなら一文に収めないといけない。
    そのコードだとif...then...とelse...で二文に分かれているので、エラーになるのが正しいはず。
    手元のHugs May 2006では
    ERROR "test.hs":2 - Syntax error in expression (unexpected `;', possibly due to bad layout)
    というエラーになった。 
115 名前:114 メール:sage 投稿日:2006/11/26(日) 13:30:35
    なぜかWindows版だと通るな。
    Hugsのバグかも。 

また,インデントについては http://en.wikibooks.org/wiki/Haskell/Indentation に詳しく載っている.