Пишу тесты с помощью QuickCheck, нужно определить instance Arbitrary для алгебраического типа, который содержит множество конструкторов, принимающих 0, 1 или 2 аргумента, для типов которых Arbitrary определен.
Соответственно, хочется не писать кучу строчек вида genConsX = ConsX <$> arbitrary, а затем arbitrary = oneOf [ genCons1, ..., genConsN], а поручить это дело компилятору.
Возможно ли это? Если да, то возможна ли чуть более сложная вещь - для части конструкторов определить генераторы вручную (у некоторых есть ограничения на множество значений аргументов), для остальных - автоматически?
И, кстати, данная процедура как-нибудь называется во всяких там теориях?