Ваш код, как написано, у меня работает. Так что я не уверен, что именно не так, но я могу дать вам несколько полезных (надеюсь!) Подсказок.
В первую очередь, попробуйте не использовать механизм регистрации, а вместо этого использовать Prop.forAll
, как показано ниже:
let pro_zip =
Prop.forAll arbMyGen2 (fun (xs,ys) ->
(xs, ys) = List.unzip(List.zip xs ys)
|> Prop.collect (List.length xs))
do Check.Quick pro_zip
Примечание. Я также изменил ваш вызов Prop.collect
, чтобы собрать длину списка (ов), что дает несколько более интересные результаты. Фактически ваше свойство уже проверяет, что списки имеют одинаковую длину (хотя и неявно), поэтому тест не пройдёт с контрпримером, если они не совпадают.
Arb.filter
преобразует существующий Arbitrary
(то есть генератор и фильтр) в новый Arbitrary
. Другими словами, arbMyGen2
имеет функцию сжатия, которая будет работать (т. Е. Возвращает только меньшие пары списков равной длины), тогда как в genZip()
вы выбрасываете усадку. Было бы хорошо просто написать
type MyGenZ =
static member genZip() = arbMyGen2
вместо.