Verificação rápida, definindo instâncias arbitrárias usando uma função cujo resultado depende de seus argumentos

Eu tenho uma funçãoarbExample para gerar um aleatórioExample tipo de dados que depende de várias funções.

Estou tentando fazer alguns testes de propriedade fazendoquickCheck prop_example, o problema é que não sei definir umArbitrary instância paraExample que usaarbExample.

Eu gosto de poder correrquickCheck prop_example enquanto especifica oGens estrutura de dados quearbExample usos.

data Example = Example
    { myInt  :: Int 
    , myList :: [String]
    } deriving (Show)

data Gens =  Gens
    { gen1 :: Gen Int
    , gen2 :: Gen String }

arbExample :: Gens -> Gen Example
arbExample gens = do 
    i  <- gen1 gens 
    xs <- vectorOf i (gen2 gens)
    return Example{myInt=i, myList=xs}

prop_example :: Example -> Property
prop_example example =  do
    let len = length (myList example) 
    monadicIO $ do 
        -- result of running some program
        successful <- run $ (\e -> return False) example  
        case successful of
            True  -> return ()
            False -> fail "failure "

instance Arbitrary Example where
    arbitrary =  arbExample _ {- ??? -}

questionAnswers(1)

yourAnswerToTheQuestion