読者です 読者をやめる 読者になる 読者になる

ghcのwarningについて

Haskell Advent Calendarに拙文を書いたことで、いけがみさん, やまもとさんなどから教えてもらったので、ghcのwarningについて調べてみました。

まず、warningの一覧はghcのドキュメントの中にあって、和訳も整備されていますフラグ早見表というのもあります。

次に、ホームに.ghciファイルを書いておくとghciの起動時にコマンドを実行できるということを知りました。.ghciの使い方も和訳されてます。じゃあghcにもデフォルトでフラグ渡したりできないのかな、と思いましたが、.ghcファイルというのは無いようなので、これはまあMakefileなり何なりから渡してください、ということなのでしょう。

さて、warning一覧に書いてあるwarningを出したり消したりしてみて遊んでいたのですが、-fwarn-incomplete-record-updates のところで詰ってしまいました。これは以下のように、存在しないかもしれないレコードを更新しようとするかもしれないコードに対して警告を発するというものです。

data Foo = Foo { x :: Int }
         | Bar

f :: Foo -> Foo
f foo = foo { x = 6 }

"このオプションはとてもうるさいことがあり、プログラムのバグを示していないことがしばしばあるので、デフォルトでは有効にされていない。"とされ、-Wallでも有効にされないので、気にしなくてもいいのかもしれませんが、それでもWarningである以上、消すことができるはずですよね。それでまあ

data Foo = Foo {record::Int} 
         | Bar deriving (Show)

main::IO ()
main = do
  print y where
    x = Foo 40
    y = f x
    f :: Foo -> Foo
    f foo = case foo of 
              Foo _ -> foo{record=6}
              Bar -> foo

こうかな、などとやって見ましたが、消えませんでしたね・・・こうなってくるととても気になります。どなたか、上のプログラムを ghc --make -Wall -Werror -fwarn-incomplete-record-updates でもコンパイルできるようにする方法、わかりますか?まあ、気にしなくてもいいのかもしれませんが、それでもWarningである以上、消すことができるはずですよね・・・。なんだか偏執狂的になってきたので、正気度チェックをしたほうがいいかもしれませんね。