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!

War es hilfreich?

Lösung

[[Int]] ist schon ein Arbitrary Instanz (weil Int ist ein Arbitrary So ist es beispielsweise auch [a] für alle as, 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top