Заставьте Test.QuickCheck.Batch использовать тип по умолчанию для тестирования функций списка - PullRequest
6 голосов
/ 15 сентября 2008

Я тестирую функцию, называемую извлечения, которая работает с любым списком.

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?

1 Ответ

7 голосов
/ 15 сентября 2008

Руководство по быстрой проверке говорит "нет":

Свойства должны иметь мономорфные типы. «Полиморфные» свойства, такие как приведенные выше, должны быть ограничены конкретным типом, который будет использоваться для тестирования Это удобно сделать, указав типы одного или нескольких аргументов в

где types = (x1 :: t1, x2 :: t2, ...)

пункт ...

...