The Arbitrary
class is for types that can be randomly generated by QuickCheck.
The minimal implementation of Arbitrary
is the arbitrary
method, which runs in the Gen
monad to produce a random value.
Here is an instance of Arbitrary
for the following datatype of non-empty lists.
import Test.QuickCheck.Arbitrary (Arbitrary(..))
import Test.QuickCheck.Gen (oneof)
import Control.Applicative ((<$>), (<*>))
data NonEmpty a = End a | Cons a (NonEmpty a)
instance Arbitrary a => Arbitrary (NonEmpty a) where
arbitrary = oneof [ -- randomly select one of the cases from the list
End <$> arbitrary, -- call a's instance of Arbitrary
Cons <$>
arbitrary <*> -- call a's instance of Arbitrary
arbitrary -- recursively call NonEmpty's instance of Arbitrary
]