Generazione di una lista di liste di Int con QuickCheck
-
18-09-2019 - |
Domanda
sto lavorando attraverso Real World
Haskell uno dei
esercizi del capitolo 4 è quello di implementare una versione basata su foldr
concat
. Ho pensato che questo sarebbe un ottimo candidato per il test con
QuickCheck poiché non v'è un'implementazione esistente per convalidare il mio
risultati. Questo mi obbliga tuttavia a definire un'istanza del
Arbitrary
typeclass che può generare [[Int]]
arbitrario. Finora ho
stato in grado di capire come fare questo. Il mio primo tentativo è stato:
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
Ciò si traduce in nessun test in corso di esecuzione. Guardando vari pezzi e
pezzi che ho indovinato che era necessaria una dichiarazione di istanza Arbitrary
e
aggiunto
instance Arbitrary a => Arbitrary [[a]] where
arbitrary = sized arb'
where arb' n = vector n (arbitrary :: Gen a)
Il risultato è ghci lamentava che la mia dichiarazione di istanza era
non validi e che l'aggiunta di -XFlexibleInstances potrebbe risolvere il mio problema.
Aggiungendo la direttiva {-# OPTIONS_GHC -XFlexibleInstances #-}
risultati in un tipo non corrispondente e una sovrapposizione casi di avvertimento.
Quindi la mia domanda è ciò che è necessario per fare questo lavoro? Sono ovviamente nuovo per Haskell e non sto trovando tutte le risorse che mi aiutano fuori. Tutti gli indicatori sono molto apprezzate.
Modifica
Sembra ero distorta dalla uscita del QuickCheck quando in un test prima fconcat
modo è definito come
fconcat = undefined
In realtà attuare la funzione correttamente anzi dà il risultato atteso. DOOP
Soluzione
[[Int]]
è già un'istanza Arbitrary
(perché Int
è un'istanza Arbitrary
, quindi è [a]
per tutti a
s che sono esse stesse istanze di Arbitrary
). In modo che non è il problema.
ho eseguito il codice di me stesso (sostituendo import FoldExcercises
con fconcat = concat
) ed eseguito 200 test come mi sarei aspettato, quindi sono perplesso sul motivo per cui non lo fa per voi. Ma non c'è bisogno di aggiungere un'istanza Arbitrary
.