Рассмотрим следующий код:
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 жалуется на первую программу и как я могу скомпилировать первый образец без предупреждений без добавления ложных конструкторов или случаев?