Есть ли монадическая версия 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
генераторы.