Предположим, у меня есть такие типы, как
data D = A | B String | C String
data TestIt m = TestIt {
x :: m Int
, y :: Int -> m D
}
и я пишу тест SmallCheck, поэтому мне нужно Serial
экземпляр на TestIt
:
instance Monad m => Serial m (TestIt m) where
series = TestIt <$> (pure <$> series) <~> xxx
Как написать это xxx
? Я понимаю, что для этого может потребоваться функция CoSerial
, но 1) я не уверен, 2) я не знаю, как это написать. Когда я вижу документацию CoSerial
, я вижу, что у моего CoSerial
будет Int
, а не D
в его определении:
instance (CoSerial m a) => CoSerial m (Int a) where
coseries rs = ???
поэтому я не могу понять CoSerial
с и как их использовать, чтобы сделать Serial
для Int -> m D
.
Также я хочу иметь зависимый серийный номер для y
поля . Я имею в виду, что если x
имеет образец 0, тогда в качестве аргумента серийный номер y
должен получить 0
. Возможно ли это?