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 здесь, чтобы определить тип второго списка. Возможно, вы захотите изменить это в соответствии с вашими конкретными потребностями.)

Другие вопросы по тегам