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

Était-ce utile?

La solution

[[Int]] est déjà une instance de Arbitrary (parce Int est une instance de Arbitrary, est donc [a] pour tous as 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top