Комбинаторы QuickCheck для сокращения списков длины в заданных пределах - PullRequest
2 голосов
/ 24 сентября 2019

Есть ли функция QuickCheck для создания списка, длина которого находится в заданном диапазоне, аналогично тому, что можно было бы достичь с hedgegog, например:

Gen.list (Range.constant 5 13) someGen

Я думаю, что можно написать что-то вроде:

  do
    n <- choose (minLength, maxLength)
    vectorOf n genA

, делающее такую ​​функцию излишней, но потом мне интересно, существуют ли QuickCheck комбинаторы для сокращения списков, инвариант которых состоит в том, что они должны иметь минимальную длину.Определение shrink, например:

  filter ((minLength <=) . length) [ xs' | xs' <- shrink xs ]

, представляется довольно неэффективным, поскольку мы сокращаем сроки, которые мы могли видеть заранее, и которые недопустимы (поскольку длина будет ниже минимального порога).

1 Ответ

1 голос
/ 24 сентября 2019

Если вы посмотрите на source функции listOf1 , вы увидите, что она реализована практически так же, как во втором фрагменте кода, за исключением того, что она использует size функция, которая означает, что верхняя граница уменьшается при выполнении сжатия.Я думаю, что замена 1 на желаемую минимальную границу должна помочь.

...