考虑下面的代码:GADT的失败全面性检查
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
即使乐趣是一个详尽的比赛,与-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会抱怨第一个程序,我怎样才能在没有警告的情况下编译第一个样本,而不添加虚假的构造函数或案例?
最好的部分是如何添加fun(Inl Foo)= ...'是一个类型错误。男人,你不能休息一下! (但当然是用'_'工作) – 2013-04-25 22:25:04