[Haskell-beginners] generating arbitrary parameter lists

Edward Z. Yang ezyang at MIT.EDU
Thu Sep 23 23:57:19 EDT 2010


Hello Andy,

Gen is a funny typeclass, in particular I can write something like:

prop_foo x y z = {- do something with x y z -}

and QuickCheck will automatically fill in x, y, z using arbitrary from
the inferred type classes.  This will work fine for z but no so much
for x and y in your example, in which case you can create newtypes
that encodes things like [bounded from 0.0 to 1.0], etc.

I often find hanging lambda style with forAll to be quite palatable,
so I frequently find myself writing things like:

conditionIWantToCheck z =
    forAll (choose (0.0, 1.0)) $ \x ->
    forAll (choose (1, 10)) $ \y ->
    {- condition -}

Especially when the inner forAlls have dependencies on earlier forAlls,
this style is quite natural.

Cheers,
Edward

Excerpts from Amy de Buitléir's message of Thu Sep 23 17:56:39 -0400 2010:
> Whenever I want to use quickCheck to test some function with multiple
> input parameters, I end up writing boilerplate code that looks like
> the example below. I have a feeling I'm missing out on some good
> Haskell tricks. In particular, writing a function like arbXYZ for
> every combination of parameter types that I need to test is a bit
> repetitive. Is there a better way?
> 
> Thank you in advance,
> Amy
> 
> ----- code example -----
> 
> functionIWantToTest :: Double -> Int -> Bool -> Double
> functionIWantToTest x y z = 27  -- pretend we're doing something useful
> 
> arbXYZ :: Gen (Double, Int, Bool)
> arbXYZ = do
>   x <- choose (0.0, 1.0)
>   y <- choose (1, 10)
>   z <- arbitrary
>   return (x, y, z)
> 
> conditionIWantToCheck :: (Double, Int, Bool) -> Bool
> conditionIWantToCheck (x, y, z) = True -- pretend we're checking something
> 
> prop_i_want_to_check :: Property
> prop_i_want_to_check = forAll arbXYZ conditionIWantToCheck


More information about the Beginners mailing list