Ответ 1
Запись экземпляра Arbitrary
для вашего типа данных проста. Вам просто нужно реализовать функцию Arbitrary
, которая должна вернуть Gen Cell
. Самый простой способ сделать это - использовать существующие экземпляры Arbitrary
, а также отметить, что Gen
является монадой, поэтому мы можем использовать do
-notation:
instance Arbitrary Cell where
arbitrary = do
Positive x <- arbitrary
Positive y <- arbitrary
return $ Cell x y
В качестве альтернативы генераторы часто могут быть написаны элегантно с использованием операторов из Control.Applicative
:
instance Arbitrary Cell where
arbitrary = Cell <$> pos <*> pos
where pos = getPositive <$> arbitrary -- getPositive requires QC >= 2.5
Здесь я также использовал модификатор Positive
из Test.QuickCheck.Modifiers, чтобы гарантировать, что мы генерируем только целые положительные числа.
Для написания более сложных генераторов посмотрите на различные генераторы из Test.QuickCheck.Gen.