Есть ли монадическая версия Arbitrary для использования с QuickCheck?

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

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

2 ответа

Решение

Случайно создать контекст

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

Произвести случайное действие

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

Положить их вместе

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

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

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