
* martin
Am 07/12/2013 09:18 AM, schrieb Roman Cheplyaka:
QuickCheck's Gen is a functor. So you can generate a list, and then use fmap to add a hash to it.
instance Arbitrary HashedList where arbitrary = addHashToList <$> arbitrary
This requires HashedList to be a new type, right? So far my code only used type synonyms.
Does this mean I have to convert type synonyms into types in order to use QuickCheck?
Probably. Technically, you could use OverlappingInstances to provide a special case for your lists (because they have a spcific shape), but I'd consider it a kludge in this case. Or you can avoid defining an instance at all, as Aleksey has pointed out.
Does this mean I have to "plan for QuickCheck" when I design my types?
Kind of. It's not really specific to QuickCheck. Every time you want to give some non-standard instances to your types, you should be using newtypes or data-types. More generally, you should be using newtypes or data types every time when you introduce a non-trivial abstraction that isn't described by the standard types. You case is a good example of that. Roman