Let's see, I am quite new to it, so this is a check to see if I understood the things correctly ;)

Joel Reymont wrote:
Folks,

I understand that arbitrary defines the possible values.

How do I generally come up with co-arbitrary, though?
you need to change a generator depending on the value of your type.

variant changes the seed of the generator adding an integer to it, so if you can map your object to mostly different integers (like the hash function) you can modify the generators using something like
   coarbitrary a = variant (hash a)

then
variant 1 . coarbitrary a
is simply modify a little (variant 1) the modification that coarbitrary a would do.

as to why you need this, it is to generate functions that have as starting domain your type.

Fawzi
Would someone kindly explain the choice of co-arbitrary in the following cases, specially the very last bit with "variant 1 . coarbitrary a"?

instance Arbitrary Char where
    arbitrary     = elements ([' ', '\n', '\0'] ++ ['a'..'h'])
    coarbitrary c = variant (fromEnum c `rem` 4)

instance Arbitrary Ordering where
    arbitrary      = elements [LT, EQ, GT]
    coarbitrary LT = variant 0
    coarbitrary EQ = variant 1
    coarbitrary GT = variant 2

instance Arbitrary a => Arbitrary (Maybe a) where
    arbitrary            = frequency [ (1, return Nothing)
                                     , (3, liftM Just arbitrary) ]
    coarbitrary Nothing  = variant 0
    coarbitrary (Just a) = variant 1 . coarbitrary a

    Thanks, Joel

--
http://wagerlabs.com/





_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to