[Haskell-cafe] Help using QuickCheck
Andrew Pimlott
andrew at pimlott.net
Fri Oct 21 14:24:46 EDT 2005
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'++"
> <hugsin")
>
> (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
More information about the Haskell-Cafe
mailing list