不完全なパターンマッチを絶対に許さない!方法

「パターンマッチが不完全な場合に、警告ではなくコンパイルエラーにする方法はあるのですか?」と個人的にご質問を頂いたので、回答のついでにブログにも書いてみることにしました。随分と久しぶりの記事になってしまいました。。
結論から言うと、コンパイラオプションを指定する方法があります。


まず、以下のようなコードがあったとします。

type Foo = A | B | C

let foo = function
    | A -> "A"
    | B -> "B"

このコードをコンパイルしてみると、以下のように警告されるものの、一応コンパイルは成功します。

警告 FS0025: この式のパターン マッチが不完全です たとえば、値 'C' はパターンに含まれないケースを示す可能性があります。
この場合、foo C として評価すると例外(Microsoft.FSharp.Core.MatchFailureException)が発生してしまいます。


以下、コンパイラオプションの指定方法です。

Visual Studio の場合

まず、ソリューションエクスプローラーからF#プロジェクトのプロパティを開きます。
そして、[ビルド]タブを見てみると[警告をエラーとして扱う]という、
それっぽい雰囲気が出ている欄があります。
胸の高鳴りを抑えつつ[特定の警告]を選択してみると、入力欄が出現します。
そこに、対象となる警告番号の25という値を入力し、プロパティを保存します。



この状態でビルドしてみると、今度はコンパイルエラーが発生するようになります。

エラー FS0025: この式のパターン マッチが不完全です たとえば、値 'C' はパターンに含まれないケースを示す可能性があります。

fsc の場合

直接コンパイラにオプションを指定する場合は、

fsc.exe (略) --warnaserror:25
と付け加えてください。

まとめ

北海道寒い。