Haskell: свойство QuickCheck не проходит тесты с использованием последствий
У меня есть следующее свойство, которое я хочу проверить с помощью quickcheck:
prop_zip xs ys = length xs == length ys ==>
unzip (zip xs ys) == (xs,ys)
Несмотря на то, что в соответствии с определением zip и unzip кажется логически правильным, что это свойство должно быть правильным для списков одинаковой длины, QuickCheck заканчивается на:
*** Gave up! Passed only 49 tests.
Заранее спасибо за любой намек или совет!
1 ответ
Предварительные условия, которые трудно выполнить, генерируя случайные тестовые случаи, часто бывают плохой идеей в QuickCheck. Вместо этого вам следует осторожно использовать генераторы для автоматического создания тестовых случаев, которые удовлетворяют предварительному условию.
Например, в этом случае вы можете использовать forAll
чтобы сгенерировать второй список такой же длины, что и первый список:
prop_zip' (xs :: [a]) =
forAll (vectorOf (length xs) arbitrary) $ \ (ys :: [a]) ->
unzip (zip xs ys) == (xs, ys)
(Я дополнительно использую ScopedTypeVariables
здесь, чтобы определить тип второго списка. Возможно, вы захотите изменить это в соответствии с вашими конкретными потребностями.)