Hacer La Prueba.QuickCheck.Lote de utilizar un tipo por defecto para las pruebas de la lista de funciones
-
09-06-2019 - |
Pregunta
Estoy probando una función llamada extracciones que opera a través de cualquier lista.
extractions :: [a] -> [(a,[a])]
extractions [] = []
extractions l = extract l []
where extract [] _ = []
extract (x:xs) prev = (x, prev++xs) : extract xs (x : prev)
Quiero poner a prueba, por ejemplo, con
import Test.QuickCheck.Batch
prop_len l = length l == length (extractions l)
main = runTests "extractions" defOpt [run prop_len]
Pero esto no compilará;Tengo que suministrar un tipo ya sea para run
o prop_len
, porque QuickCheck no puede generar [a]
, tiene que generar algo concreto.Así que elegí Int
:
main = runTests "extractions" defOpt [r prop_len]
where r = run :: ([Int] -> Bool) -> TestOptions -> IO TestResult
Es allí cualquier manera de conseguir QuickCheck a elegir a
para mí en lugar de tener lo especificado en el tipo de run
?
Solución
El quickcheck manual dice "no":
Las propiedades deben tener monomórficas tipos.`Polimórficos' propiedades, tales como el de arriba, debe ser restringida a un determinado tipo de ser utilizado para la prueba.Es conveniente hacerlo indicando los tipos de uno o más argumentos en un
donde los tipos = (x1 ::t1, x2 ::t2, ...)
cláusula de...