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 に詳しく載っている.