Сделайте тест.Быстрая проверка.Пакетное использование типа по умолчанию для тестирования функций списка
-
09-06-2019 - |
Вопрос
Я тестирую функцию под названием extractions, которая работает с любым списком.
extractions :: [a] -> [(a,[a])]
extractions [] = []
extractions l = extract l []
where extract [] _ = []
extract (x:xs) prev = (x, prev++xs) : extract xs (x : prev)
Я хочу протестировать это, например, с помощью
import Test.QuickCheck.Batch
prop_len l = length l == length (extractions l)
main = runTests "extractions" defOpt [run prop_len]
Но это не будет компилироваться;Я должен указать тип либо для run
или prop_len
, потому что QuickCheck не может генерировать [a]
, это должно породить что-то конкретное.Поэтому я выбрал Int
:
main = runTests "extractions" defOpt [r prop_len]
where r = run :: ([Int] -> Bool) -> TestOptions -> IO TestResult
Есть ли какой-нибудь способ заставить QuickCheck выбрать a
для меня вместо того, чтобы указывать это в типе run
?
Решение
Тот Самый руководство по быстрой проверке говорит "нет".:
Свойства должны иметь мономорфные типы.`Полиморфные" свойства, подобные приведенному выше, должны быть ограничены определенным типом, который будет использоваться для тестирования.Удобно сделать это, указав типы одного или нескольких аргументов в
где типы = (x1 ::t1, x2 ::t2, ...)
оговорка...