警告を消す・Warning: A do-notation statement discarded a result of type ...

do記法の中での警告

Yesodを書いているとdo記法をたくさん使うのですが、ときどき以下のような警告に遭遇します。

Handler/Root.hs:36:7:
    Warning: A do-notation statement discarded a result of type <型情報>.
             Suppress this warning by saying "_ <- ($)
                                                     <コード片>,
             or by using the flag -fno-warn-unused-do-bind

「do記法の中の文が結果を戻してるのに変数で受けてませんよ」という意味のようですね。

文の結果がいらない、というのはよくあることだと思うのでこの警告は少々うるさく感じます。

警告を消すには、警告文にある通り

_ <- hogehoge...

という具合に _ で受けてあげればいいのですが、数が多くなってくると面倒ですねぇ。Haskellらしいと言えばらしいのですが。

警告文が示しているもう1つの解決方法は、コンパイルオプションを追加して警告を出さなくする、というものです。
Yesodの場合、これはcabalファイルにて指定します。

ghc-options:   -Wall -threaded -O0

というところに追記して

ghc-options:   -Wall -threaded -O0 -fno-warn-unused-do-bind

とします。

なお上記に該当する行は複数あるのですが、開発中はlibraryというセクション(という呼び名でいいのかな?)の方に追記する必要があります。

どちらの解消方法がいいのか

当面は _ で受ける方法で書くことにします。
この書き方には「この文の結果は使わない!」と強く表明する効果があるからです。
数が多くなってくると面倒ですが、個人で開発している分にはあまり大したことにはならないでしょう。

規模が大きい開発では、警告があまりたくさん出ると真に大事な警告が埋もれてしまう可能性が出てくるので、そんなときはコンパイルオプションを使うといいと思います。
「そもそもたくさん警告が出る状態がどうなんだ?」という議論はありますが、現実としてそれはよくあることですので・・・