Writing an instance of Arbitrary for your data type is easy. You just have to implement the arbitrary function, which should return a Gen Cell. The simplest way to do this is to make use of existing Arbitrary instances and also note that Gen is a monad, so we can use do-notation:
instance Arbitrary Cell where
arbitrary = do
Positive x <- arbitrary
Positive y <- arbitrary
return $ Cell x y
Alternatively, generators can often be written elegantly using operators from Control.Applicative:
instance Arbitrary Cell where
arbitrary = Cell <$> pos <*> pos
where pos = getPositive <$> arbitrary -- getPositive requires QC >= 2.5
Here, I’ve also made use of the Positive modifier from Test.QuickCheck.Modifiers to ensure that we only generate positive integers.
For writing more complex generators, have a look at the various generators from Test.QuickCheck.Gen.