I have a Building with a field glass: Glass.
I want to use quickcheck. Therefor I wrote a TestGlass.hs with the Arbitrary instance declaration for Glass. I also want to make Building an instance of Arbitrary. For the field glass in the Building I need the arbitrary :: Gen Glass function out of TestGlass.hs.
How do I export and use the instance declarations from TestGlass.hs?
Glass.hs
module Glass(
Glass(..))
where
data Glass = Glass Int
TestGlass.hs
module TestGlass()
where
import Test.QuickCheck
import Test.QuickCheck.Gen
import Glass
instance Arbitrary Glass where
arbitrary = do
n <- choose (1,8) :: Gen Int
return $ Glass n
Building.hs
module Building ()
where
import Glass
import TestGlass
import Test.QuickCheck
import Test.QuickCheck.Gen
data Building = Building {
glass :: Glass
}
instance Arbitrary Building where
arbitrary = do
g <- arbitrary :: (Gen Glass)
return Building { glass = g}
When I compile Building I get:
Building.hs:13:23:
Ambiguous occurrence `arbitrary'
It could refer to either `Building.arbitrary',
defined at Building.hs:12:1
or `Test.QuickCheck.arbitrary',
imported from `Test.QuickCheck' at Building.hs:5:1-22
(and originally defined in `Test.QuickCheck.Arbitrary')
It looks like the compiler doesn’t look at the instance declarations in the TestGlass module.
What is wrong in my code?
I want to split the testcode as much as possible from the non-test code and I don’t want to merge the modules Building and Glass (they are both already big).
Kees