考虑以下代码:
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 抱怨第一个程序,我怎样才能在不添加虚假构造函数或案例的情况下编译第一个示例而不发出警告?