Génération d'une liste de listes de Int avec QuickCheck
-
18-09-2019 - |
Question
Je travaille par Real World
Haskell un des
exercices du chapitre 4 est de mettre en œuvre une version de foldr
de
concat
. Je pensais que ce serait un excellent candidat pour tester avec
QuickCheck car il y a une implémentation existante pour valider mon
résultats. Cela me demande cependant de définir une instance de la
Arbitrary
de classe de types qui peut générer [[Int]]
arbitraire. Jusqu'à présent, j'ai
été incapable de comprendre comment faire cela. Ma première tentative a été:
module FoldExcercises_Test
where
import Test.QuickCheck
import Test.QuickCheck.Batch
import FoldExcercises
prop_concat xs =
concat xs == fconcat xs
where types = xs ::[[Int]]
options = TestOptions { no_of_tests = 200
, length_of_tests = 1
, debug_tests = True }
allChecks = [
run (prop_concat)
]
main = do
runTests "simple" options allChecks
Il en résulte pas de tests en cours. En regardant différents bits et
pièces je devinais qu'une déclaration d'instance Arbitrary
était nécessaire et
ajouté
instance Arbitrary a => Arbitrary [[a]] where
arbitrary = sized arb'
where arb' n = vector n (arbitrary :: Gen a)
Il en est résulté ghci plaint que ma déclaration d'instance était
invalides et que l'ajout -XFlexibleInstances pourrait résoudre mon problème.
Ajout de la directive {-# OPTIONS_GHC -XFlexibleInstances #-}
se traduit par une non-concordance de type et d'un cas de chevauchement d'avertissement.
Alors, ma question est ce qu'il faut pour faire ce travail? Je suis évidemment nouveau Haskell et je ne suis pas trouver des ressources qui me aider. Tous les pointeurs sont très appréciés.
Modifier
Il semble que je mal orienté par la sortie de QuickCheck lors d'une première manière essai fconcat
est défini comme
fconcat = undefined
En fait, la mise en œuvre de la fonction donne correctement en effet le résultat attendu. DOOP
La solution
[[Int]]
est déjà une instance de Arbitrary
(parce Int
est une instance de Arbitrary
, est donc [a]
pour tous a
s qui sont eux-mêmes des instances de Arbitrary
). Donc, ce n'est pas le problème.
Je courais votre code moi-même (en remplacement import FoldExcercises
avec fconcat = concat
) et il a couru 200 tests comme je l'aurais prévu, donc je suis perplexe quant à pourquoi il ne le fait pas pour vous. Mais vous ne devez pas ajouter une instance Arbitrary
.