Тип ввода quickCheck

Я пытаюсь изучить QuickCheck и понять, как это работает. Тип данных функции quickCheck:

quickCheck :: Testable prop => prop -> IO ()

С другой стороны, у меня есть функция

prop_rev_involutive:Eq a => [a] -> Bool
prop_rev_involutive l = (reverse $ reverse l) == l

которые я использую для ввода для quickCheck. Запуск quickCheck prop_rev_involutive работает нормально, но я не понимаю, как совпадают типы.

считается ли тип [a] -> Bool Testable? Почему это?


person Tomer    schedule 04.03.2020    source источник
comment
Подсказка: посмотрите экземпляры для Testable . Также не забудьте подумать о типе по умолчанию.   -  person Joseph Sible-Reinstate Monica    schedule 04.03.2020


Ответы (1)


Testable - это класс типа - по сути, абстракция над вещами, которую можно превратить в автоматизированный тест. Класс типа имеет несколько экземпляров, один из которых Bool:

Testable Bool

Однако это не тот тип prop_rev_involutive. Другой экземпляр Testable:

(Arbitrary a, Show a, Testable prop) => Testable (a -> prop)

Это объявляет, что для любого a, который является экземпляром как Arbitrary, так и Show, функция от a до prop сама является Testable. Мы уже установили, что Bool является экземпляром Testable, поэтому теперь вам нужно выяснить, является ли [a] экземпляром Arbitrary и Show.

Класс типа Arbitrary имеет множество экземпляров, один из которых:

Arbitrary a => Arbitrary [a]

Это заявляет, что если a является экземпляром Arbitrary, то [a] тоже. Итак, a это Arbitrary экземпляр? Это зависит от того, с каким конкретным типом вы действительно работаете quickCheck. В некоторых средах Haskell по умолчанию используются определенные типы (например, Int, который является экземпляром Arbitrary).

Вам нужно будет провести те же рассуждения для класса типа Show.

Я не думаю, что любая неограниченная функция [a] -> Bool является Testable экземпляром, но что-то вроде (Arbitrary a, Show a) => [a] -> Bool есть. Примеры включают [Int] -> Bool и [Char] -> Bool. Это потому, что Bool - это Testable, а Int и Char - это экземпляры Arbitrary и Show.

person Mark Seemann    schedule 04.03.2020