Учитывая следующую программу:
{-# LANGUAGE DataKinds, GADTs #-}
{-# LANGUAGE TypeFamilies #-}
data Foo = A | B
type family IsA (foo :: Foo) :: Bool
type instance IsA A = True
type instance IsA B = False
data Bar (foo :: Foo) where
BarA :: (IsA foo ~ True) => Int -> Bar foo
BarB :: (IsA foo ~ False) => String -> Bar foo
f :: Bar A -> Int
f bar = case bar of
BarA x -> x
Я получаю это предупреждение от GHC 7.4.2 при использовании -fwarn-incomplete-patterns
для общей функции f
, определенной выше:
Warning: Pattern match(es) are non-exhaustive
In a case alternative: Patterns not matched: BarB _
Конечно, нет смысла даже пытаться добавить совпадение для BarB
:
Couldn't match type `'False' with `'True'
Inaccessible code in
a pattern with constructor
BarB :: forall (foo :: Foo). IsA foo ~ 'False => String -> Bar foo,
in a case alternative
In the pattern: BarB _
In a case alternative: BarB _ -> undefined
In the expression:
case bar of {
BarA x -> x
BarB _ -> undefined }
Есть ли способ убедить GHC, что f
тотален? Кроме того, это ошибка GHC или просто известное ограничение; или на самом деле есть очень веская причина, по которой невозможно увидеть, что совпадение с образцом в f
завершено?