Quickcheck, que define instancias arbitrarias utilizando una función cuyo resultado depende de sus argumentos

Tengo una funcionarbExample para generar un azarExample tipo de datos que depende de varias funciones.

Estoy tratando de hacer algunas pruebas de propiedad haciendoquickCheck prop_example, el problema es que no sé cómo definir unArbitrary instancia paraExample que usaarbExample.

Me gusta poder correrquickCheck prop_example mientras especifica elGens estructura de datos 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 _ {- ??? -}

Respuestas a la pregunta(1)

Su respuesta a la pregunta