2008-09-15 6 views
6

Je suis en train de tester une fonction appelée extraction qui fonctionne sur n'importe quelle liste.Make Test.QuickCheck.Batch utilise un type par défaut pour tester les fonctions de la liste

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

Je veux tester, par exemple, avec

import Test.QuickCheck.Batch  
prop_len l = length l == length (extractions l) 
main = runTests "extractions" defOpt [run prop_len] 

Mais cela ne compilera pas; Je dois fournir un type soit pour run ou prop_len, parce que QuickCheck ne peut pas générer [a], il doit générer quelque chose de concret. J'ai donc choisi Int:

main = runTests "extractions" defOpt [r prop_len] 
    where r = run :: ([Int] -> Bool) -> TestOptions -> IO TestResult 

Est-il possible d'obtenir QuickCheck choisir a pour moi au lieu de l'avoir précisé dans le type de run?

Répondre

7

Le quickcheck manual dit "non":

Les propriétés doivent avoir des types monomorphes. Les propriétés «polymorphes», comme celle ci-dessus, doivent être limitées à un type particulier à utiliser pour les tests. Il est commode de le faire en précisant les types d'un ou plusieurs arguments dans un

où types = (x1 :: t1, t2 x2 :: ...)

clause

...

Questions connexes