15

次のコードを検討してください。

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 が最初のプログラムで文句を言うのはなぜですか? また、偽のコンストラクタやケースを追加せずに、最初のサンプルを警告なしでコンパイルするにはどうすればよいですか?

4

3 に答える 3

7

申し訳ありませんが、最初の例は、あなたが思っているほど網羅的ではありません。

∀x. x ⊢ fun (Inl (undefined :: Foo B))
*** Exception: Test.hs:48:1-17: Non-exhaustive patterns in function fun

はい、迷惑ですが、休憩です。⊥ いいものが持てない理由。:[

于 2013-04-25T22:53:04.687 に答える