Hatena::ブログ(Diary)

あどけない話

2012-02-06

doの中のif

Haskellの文法はかなり心地よいが、もちろん嫌な点もある。その代表例が、do の中の if 式である。

if は一つの式を成す必要があるので、以下のように行を下げないといけない。

deleteFile :: FilePath -> IO ()
deleteFile file = do
    exist <- doesFileExist file
    if exist
        then removeFile file
        else return ()

以下のように書きたいけれど、Haskell 98 としては誤りである。

deleteFile :: FilePath -> IO ()
deleteFile file = do
    exist <- doesFileExist file
    if exist then
        removeFile file
    else
        return ()

Haskell 2010 では、if 式を三つの式から校正されるよう変更することで、上記のように書けるようにした。Haskell 98 であっても、DoAndIfThenElse拡張を使えば、この形式が利用できる。

しかし、実際に使ってみると、以下のような問題がある。

  • DoAndIfThenElse に対応していない GHC 6 がまだ使われいる
  • hlint が新しい if 式に対応していない

そこで、当面僕は do の中の if 式を以下のように書くことにした。

deleteFile :: FilePath -> IO ()
deleteFile file = do
    exist <- doesFileExist file
    if exist then
        removeFile file
      else
        return ()

つまり、else の前に 2 つ空白文字を入れる。if は一つの式になり、見た目もあまり損ねない。