Быстрая проверка, определяющая произвольные экземпляры с использованием функции, результат которой зависит от ее аргументов

У меня есть функцияarbExample генерировать случайныйExample тип данных, который зависит от ряда функций.

Я пытаюсь сделать некоторое тестирование свойства, делаяquickCheck prop_exampleпроблема в том, что я не знаю, как определитьArbitrary экземпляр дляExample который используетarbExample.

Мне нравится уметь бегатьquickCheck prop_example при указанииGens структура данных, котораяarbExample использует.

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 _ {- ??? -}

Ответы на вопрос(1)

Ваш ответ на вопрос