Faça Test.QuickCheck.Batch usar um tipo padrão para testar funções de lista
-
09-06-2019 - |
Pergunta
Estou testando uma função chamada extrações que opera em qualquer lista.
extractions :: [a] -> [(a,[a])]
extractions [] = []
extractions l = extract l []
where extract [] _ = []
extract (x:xs) prev = (x, prev++xs) : extract xs (x : prev)
Quero testá-lo, por exemplo, com
import Test.QuickCheck.Batch
prop_len l = length l == length (extractions l)
main = runTests "extractions" defOpt [run prop_len]
Mas isso não será compilado;Eu tenho que fornecer um tipo para run
ou prop_len
, porque o QuickCheck não pode gerar [a]
, tem que gerar algo concreto.Então eu escolhi Int
:
main = runTests "extractions" defOpt [r prop_len]
where r = run :: ([Int] -> Bool) -> TestOptions -> IO TestResult
Existe alguma maneira de fazer com que o QuickCheck escolha a
para mim, em vez de especificá-lo no tipo de run
?
Solução
O manual de verificação rápida diz "não":
As propriedades devem ter tipos monomórficos.Propriedades `polimórficas', como a acima, devem ser restritas a um tipo específico a ser usado para teste.É conveniente fazer isso declarando os tipos de um ou mais argumentos em uma
onde tipos = (x1 ::t1,x2::t2, ...)
cláusula...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow