
On Fri, 24 Mar 2006, Henning Thielemann
Further on think of QuickCheck: A Cardinal type with an Arbitrary instance would save us the (>=0) condition and it would reduce the number of tests that must be skipped because of non-fulfilled conditions. Because I was confronted with adding positivity checks to QuickCheck properties quite frequently, I finally wrote wrappers newtype Cardinal = Cardinal Integer deriving (Show, Read, Eq, Ord, Ix) newtype Card = Card Int deriving (Show, Read, Eq, Ord, Ix) in order to simplify such checks.
I wouldn't mind having a natural number type, but the technique above is useful anyway. When using QuickCheck you often need custom generators, and the technique removes the need for non-dependent forAlls: prop_foo (Cardinal n) (Balanced t) (Prime p) (Small s) = ... n ... t ... p ... s ... The property above is considerably easier to read than the following one: prop_foo = forAll cardinal $ \c -> forAll balanced $ \t -> forAll prime $ \p -> forAll small $ \s -> ... n ... t ... p ... s ... It would be nice to have a bunch of newtypes like these in a library. -- /NAD