考慮下面的代碼: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