Generieren einer Liste von Int-Listen mit QuickCheck
-
18-09-2019 - |
Frage
Ich arbeite durch Real World Haskell Eine der Übungen von Kapitel 4 besteht darin, eine umzusetzen foldr
basierte Version vonconcat
.Ich dachte, dies wäre ein großartiger Kandidat für das Testen mit QuickCheck, da es eine vorhandene Implementierung gibt, um meine Ergebnisse zu validieren.Dies erfordert jedoch, dass ich eine Instanz von definiereArbitrary
Typklasse, die beliebige generieren kann [[Int]]
.Bisher konnte ich nicht herausfinden, wie das geht.Mein erster Versuch war:
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
Dies führt dazu, dass keine Tests durchgeführt werden.Wenn ich verschiedene Teile betrachtete, vermutete ich, dass ein Arbitrary
Eine Instanzerklärung wurde benötigt und hinzugefügt
instance Arbitrary a => Arbitrary [[a]] where
arbitrary = sized arb'
where arb' n = vector n (arbitrary :: Gen a)
Dies führte dazu, dass sich GHCI beschwert, dass meine Instanzerklärung ungültig war und dass das Hinzufügen von -xflexibleInstanzen mein Problem lösen könnte.Hinzufügen der {-# OPTIONS_GHC -XFlexibleInstances #-}
Die Richtlinie führt zu einer Art Fehlpaarung und einer überlappenden Fälle.
Meine Frage ist also, was nötig ist, damit das funktioniert?Ich bin offensichtlich neu in Haskell und finde keine Ressourcen, die mir helfen.Alle Hinweise werden sehr geschätzt.
Bearbeiten
Es scheint, als hätte mich die Ausgabe von QuickCheck beim ersten Testen in die Irre geführt fconcat
ist definiert als
fconcat = undefined
Die tatsächliche korrekte Implementierung der Funktion führt tatsächlich zum erwarteten Ergebnis. DOOP!
Lösung
[[Int]]
ist schon ein Arbitrary
Instanz (weil Int
ist ein Arbitrary
So ist es beispielsweise auch [a]
für alle a
s, die selbst Beispiele dafür sind Arbitrary
).Das ist also nicht das Problem.
Ich habe Ihren Code selbst ausgeführt (ersetzen import FoldExcercises
mit fconcat = concat
) und es hat 200 Tests durchgeführt, wie ich es erwartet hätte, daher bin ich mir nicht sicher, warum es das nicht für Sie erledigt.Sie müssen jedoch KEINES hinzufügen Arbitrary
Beispiel.