次のコードを検討してください。
data (:+:) f g a = Inl (f a) | Inr (g a)
data A
data B
data Foo l where
Foo :: Foo A
data Bar l where
Bar :: Bar B
type Sig = Foo :+: Bar
fun :: Sig B -> Int
fun (Inr Bar) = 1
funは徹底的に一致しますが、-Wall を指定してコンパイルすると、GHC はケースの欠落について文句を言います。ただし、別のコンストラクターを追加すると:
data (:+:) f g a = Inl (f a) | Inr (g a)
data A
data B
data Foo l where
Foo :: Foo A
Baz :: Foo B
data Bar l where
Bar :: Bar B
type Sig = Foo :+: Bar
fun :: Sig B -> Int
fun (Inr Bar) = 1
fun (Inl Baz) = 2
そうすれば、GHC は楽しみが完全であることを正しく検出します。
私は自分の仕事でこれに似たコードを使用しています.ケースを見逃した場合はGHCに警告を発させ、そうでない場合は警告を発させないようにしたいと考えています. GHC が最初のプログラムで文句を言うのはなぜですか? また、偽のコンストラクタやケースを追加せずに、最初のサンプルを警告なしでコンパイルするにはどうすればよいですか?