Есть ли монадическая версия Arbitrary для использования с QuickCheck? - PullRequest
9 голосов
/ 25 марта 2012

Когда я хочу протестировать чистый код, используя QuickCheck, мне часто приходится писать экземпляр Arbitrary. Для тестирования монадического кода я могу использовать Test.QuickCheck.Monadic, как описано в этой статье .

Мой вопрос : существует ли какой-то канонический способ генерирования данных, который зависит от монадического контекста? В частности, есть ли какая-то монадическая версия Arbitrary? Как бы вы пошли о создании данных, которые требуют монадического контекста?

Ответы [ 2 ]

6 голосов
/ 26 марта 2012

Gen - это, в основном, то, что вы используете для работы с Arbitrary экземплярами в среде монад, так как класс типа Arbitrary в основном является поставщиком Gen a генераторов.

3 голосов
/ 26 марта 2012

Случайно генерировать контекст

Просто создайте подходящий случайный монадный контекст. Если вы проводите тесты, вы не можете оставаться на чистой воображаемой земле монад, вам действительно нужно выбрать конкретную монаду для тестирования. Вы выбрали монаду списка? Случайно генерировать список в качестве контекста. Государственная монада? Произвольно генерировать значение типа состояния для контекста. Писатель? Случайно создать журнал.

Произвольно сгенерировать действие

Так что именно вы хотите сгенерировать? Если это монадическое действие, то вам нужно предоставить способ генерации монадических действий для вашей конкретной монады на основе ее уникальных примитивов . например случайно генерируемые действия состояний должны быть случайным образом созданы из состояний примитивов get и put.

Соедините их

Если вы используете возможности QuickCheck для генерации функции f, которая производит монадическое действие, и используете QuickCheck для генерации контекста c, то вы можете просто c >>= f собрать их вместе. Или вы можете просто сгенерировать действие a напрямую и выполнить c >> a.

...