2008-09-15 16 views
6

Estoy probando una función llamada extracciones que opera sobre cualquier lista.Make Test.QuickCheck.Batch utiliza un tipo predeterminado para probar funciones de lista

extractions :: [a] -> [(a,[a])] 
extractions [] = [] 
extractions l = extract l [] 
    where extract [] _ = [] 
      extract (x:xs) prev = (x, prev++xs) : extract xs (x : prev) 

quiero probarlo, 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 se 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 

¿Hay alguna manera de obtener QuickCheck para elegir a para mí en lugar de haber especificado que en el tipo de run?

Respuesta

7

El quickcheck manual dice "no":

propiedades deben tener tipos monomorfas. Las propiedades `Polimórficas ', como la de arriba, deben estar restringidas a un tipo particular que se utilizará para las pruebas. Es conveniente hacerlo indicando los tipos de uno o más argumentos en un

donde tipos = (x1 :: t1, t2 :: x2, ...) Cláusula

...

Cuestiones relacionadas