[Haskell-cafe] using external instance declarations

Kata lightquake at amateurtopologist.com
Tue Nov 26 16:36:52 UTC 2013


The problem is that your definition of arbitrary for the Building instance isn’t indented under the ‘instance Arbitrary Building’, so it’s getting interpreted as two top-level statements: one that Building is an Arbitrary of Instance, and one that defines a value named ‘arbitrary’. Hence the error message. To fix this, just indent the definition of arbitrary like you did in the Glass definition.


On Tuesday, November 26, 2013 at 11:06 AM, Kees Bleijenberg wrote:

> 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
>   
>  
>  
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org (mailto:Haskell-Cafe at haskell.org)
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>  
>  


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20131126/67fc252c/attachment.html>


More information about the Haskell-Cafe mailing list