У меня есть тип данных Haskell, например
data Mytype
= C1
| C2 Char
| C3 Int String
Если я case
на a Mytype
и забудьте обработать один из случаев, GHC дает мне предупреждение (проверка полноты).
Теперь я хочу написать экземпляр QuickCheck Arbitrary
для генерации MyTypes
, например:
instance Arbitrary Mytype where
arbitrary = do
n <- choose (1, 3 :: Int)
case n of
1 -> C1
2 -> C2 <$> arbitrary
3 -> C3 <$> arbitrary <*> someCustomGen
Проблема заключается в том, что я могу добавить новую альтернативу Mytype
и забыть обновить экземпляр Arbitrary, поэтому мои тесты не тестируют эту альтернативу.
Я хотел бы найти способ использования проверки GHC, чтобы напомнить мне о забытых случаях в моем произвольном экземпляре.
Лучшее, что я придумал, это
arbitrary = do
x <- elements [C1, C2 undefined, C3 undefined undefined]
case x of
C1 -> C1
C2 _ -> C2 <$> arbitrary
C3 _ _ -> C3 <$> arbitrary <*> someCustomGen
Но это не очень элегантно.
Я интуитивно чувствую, что на это нет 100% чистого решения, но будет признателен за все, что уменьшит вероятность забыть такие случаи - особенно в большом проекте, где разделены код и тесты.