[Haskell-cafe] QuickCheck: Arbitrary for a complex type

Joel Reymont joelr1 at gmail.com
Wed Apr 4 10:44:16 EDT 2007

Suppose I have a type describing a statement and that I'm trying to  
make it an instance of arbitrary. The type looks like this:

data Statement
     = InputDecs [InputDecl]
     | VarDecs [VarDecl]
     | ArrayDecs [ArrayDecl]
     | Compound [Statement]
     | Assign (VarIdent, Expr)
     | ArrayAssign (VarIdent, [Expr], Expr)

Assuming that other types involved were instances of arbitrary, how  
do I write arbitrary for Statement?

Poking around various bits of source code I think that for a type  
like the following

data Style
     = StyleValue Expr
     | Solid
     | Dashed
     | Dotted
     | Dashed2
     | Dashed3
     deriving Show

I can write

instance Arbitrary Style where
     arbitrary = oneOf [ StyleValue . arbitrary,
                         elements [ Solid
                                  , Dashed
                                  , Dotted
                                  , Dashed2
                                  , Dashed3

I'm not sure if this is correct, though, so any help is appreciated!

	Thanks in advance, Joel


More information about the Haskell-Cafe mailing list