
On Fri, Oct 21, 2005 at 07:58:10PM +0200, Benjamin Franksen wrote:
I am asking help with using QuickCheck. I tried everything I could think of, but invariably as soon as I start invoking the quickCheck function on my property it fails with
<interactive>:1:0: No instances for (Arbitrary (OrdSeq Int), Show (OrdSeq Int)) arising from use of `quickCheck' at <interactive>:1:0-20 Probable fix: add an instance declaration for (Arbitrary (OrdSeq Int), Show (OrdSeq Int)) In the definition of `it': it = quickCheck prop_DeleteInsert
The property is quite a simple one:
prop_DeleteInsert x xs = delete x (insert x xs) == xs where types = xs :: OrdSeq Int
My code compiles just fine with ghc.
It compiles (and runs) fine as a function on OrdSeqs, with type prop_DeleteInsert :: Int -> OrdSeq Int -> Bool But as an argument to quickCheck, it needs be in the class Testable, which boils down to the requirement that Int and "OrdSeq Int" are both in the class Arbitrary. So you need to write something like instance Arbitrary a => Arbitrary (OrdSeq a) where ... This is confusing because QuickCheck is clever with type classes to check "ordinary" boolean functions. But in fact, your property is equivalent to prop_DeleteInsert = forall arbitrary $ \x -> forall arbitrary $ \xs -> delete x (insert x xs) == (xs :: OrdSeq Int) And QuickCheck doesn't know how to create arbitrary OrdSeqs unless you tell it.
I downloaded the haskell script 'quickCheck' and modified the line where ghci is executed like this:
system ("/usr/bin/ghci -cpp -package QuickCheck "++options opts'++"
(I am using ghc 6.4.1, btw). Running 'quickCheck Data/FingerSearchTreeUtil.hs' gives me:
<interactive>:1:0: Failed to load interface for `QuickCheck': Could not find module `QuickCheck': it is a member of package util-1.0, which is hidden
Strange. Replacing 'ChickCheck' with 'util' gives me the above error message about "No instance for (Show (IO ()))..."
In package QuickCheck, the module is called "Test.QuickCheck" (so "import Test.QuickCheck"), whereas in package util, it is called just "QuickCheck" (but this is deprecated). Andrew