2013-04-24 12 views
5

Ich schrieb eine Implementierung für foldl und wollte überprüfen, ob es funktionierte, habe ich einige Fälle versucht und es scheint gut zu funktionieren, aber ich will sicher gehen.Mit QuickCheck

ich über Quick Check lesen und versuchte es, aber ich kann nicht scheinen, arbeiten zu lassen, ist dies der Code

foldl'' :: (b -> a -> b) -> b -> [a] -> b 

test :: Eq b => (b -> a -> b) -> b -> [a] -> Bool 
test f e ls = foldl'' f e ls == foldl f e ls 

wenn ich quickCheck test führen Sie es den folgenden Fehler führt:

No instance for (Show (b0 -> a0 -> b0)) 
    arising from a use of `quickCheck' 
Possible fix: 
    add an instance declaration for (Show (b0 -> a0 -> b0)) 
In the expression: quickCheck prueba 
In an equation for `it': it = quickCheck prueba 

Antwort

7

Ihre Immobilie benötigt drei Eingaben: eine Funktion, ein Element und eine Liste. Das Problem ist, dass QuickCheck nicht im Allgemeinen mit Funktionen umgehen kann.

Eines der Dinge, die QuickCheck funktionieren muss, ist die Fähigkeit, fehlgeschlagene Testfälle auf die Konsole zu schreiben. Dafür benötigt es Werte, die es in eine String --anything in der Show Klasse verwandeln kann. Da Funktionen nicht in sind, können sie nicht für Eingaben verwendet werden. Von dort kommt Ihre Fehlermeldung.

Im Allgemeinen wird die Verwendung von zufällig generierten Funktionen zum Testen ziemlich schwierig sein. Ich schreibe stattdessen einfach einige konkrete Funktionen und lasse QuickCheck zufällig den Startwert und die Liste der Elemente generieren.

2

Von dem, was ich verstehe, gibt es Maschinen zum Erstellen zufälliger Funktionen in QuickCheck (siehe Test.QuickCheck.Function), aber ich kann nicht sagen, dass ich dieses Zeug gut genug, um Ihnen zu sagen, wie man es verwendet.

Das gesagt, Testen Ihrer Eigenschaft macht wahrscheinlich mehr Sinn mit Funktionen, die Sie selbst wählen, so dass Sie etwas wie quickCheck $ prueba (+) schreiben könnten, die gut funktionieren wird.

6

Es gibt eine Möglichkeit, die -Einschränkung für Eingaben zu vermeiden, die den Modifikator Blind verwenden, mit dem Sie QuickCheck-Maschinen zum Generieren von Zufallsfunktionen verwenden können.

-- Using Int instead of a, b which would be defaulted to() in GHCi 
prueba :: Blind (Int -> Int -> Int) -> Int -> [Int] -> Bool 
prueba (Blind f) e ls = foldl'' f e ls == foldl f e ls 

Das heißt, bedeutet dies die Fehlerausgabe für das Debuggen fast nutzlos ist, da es nur (*) für Blinde Eingang gedruckt wird. (Zur Demonstration, I definiert foldl'' = foldr . flip)

> quickCheck prueba 
*** Failed! Falsifiable (after 4 tests and 2 shrinks):  
(*) 
0 
[1,0] 
+0

Nicht im Umfang: Typkonstruktor oder Klasse 'Blinde‘ – chamini2

+0

@ chamini2: Haben Sie importiert 'Test.QuickCheck'? – hammar

+0

Ja, vielleicht weil ich auf OS X bin? 'Ghci --Version: Das Glorious Glasgow Haskell Compilation System, Version 7.4.2' – chamini2

Verwandte Themen